12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package flexer
- const (
- FlexerKindDot = Kind(-1 - iota)
- FlexerKindLiteralString
- FlexerKindLiteralRaw
- FlexerKindLiteralChar
- FlexerKindTerminal
- FlexerKindArrow
- FlexerKindFlexerKeyword
- FlexerKindWhitespace
- FlexerKindLineComment
- FlexerKindBlockComment
- FlexerKindFlexerAction
- )
- /*
- // Flexer generator's input own lexer specification
- dot -> '\.' .
- arrow -> "(?:->|→)" .
- terminal -> "[[:isLower:]][[:isAlNum]_-]+" .
- literal-string -> `"` flex-esc-string .
- literal-raw -> "`" flex-string .
- literal-char -> "'" flex-string .
- flexer-keyword -> "flex-skip|flex-string|flex-esc-string" .
- whitespace -> "[ \t\n\r]+" flex-skip .
- line-comment -> "//[^\n\r]+" flex-skip .
- block-comment -> "/\*(?ms:.)*?\* /" .
- flexer-action -> `%{(?ms:.)*?}%` .
- */
- type CheckedError struct {
- Error error
- }
- func Check(err error) {
- if err != nil {
- panic(CheckedError{err})
- }
- }
- func LexFlexerInputString(name, input string) []Token {
- f := NewFlexer(name, input)
- Check(f.Rule(FlexerKindWhitespace, `[ \t\n\r]+`, "", nil))
- Check(f.Rule(FlexerKindLineComment, `//[^\n\r]+[\n\r]+`, "", nil))
- Check(f.Rule(FlexerKindBlockComment, `/\*(?ms:.)*?\*/`, "", nil))
- Check(f.Rule(FlexerKindDot, `\.`, "", nil))
- Check(f.Rule(FlexerKindArrow, `(?:->|→)`, "", nil))
- Check(f.Rule(FlexerKindTerminal, `[[:lower:]][[:alnum:]_-]+`, "", nil))
- f.EscapedStringRule(FlexerKindLiteralString, `"`, `"`, "literal-string")
- f.RawStringRule(FlexerKindLiteralRaw, "`", "`", "literal-raw")
- f.RawStringRule(FlexerKindLiteralChar, `''`, `''`, "literal-char")
- Check(f.Rule(FlexerKindFlexerKeyword, `flex-skip|flex-string|flex-esc-string`, "", nil))
- Check(f.Rule(FlexerKindFlexerAction, `@{(?ms:.)*?}@`, "", nil))
- skipKinds := []Kind{SkipKind, FlexerKindWhitespace, FlexerKindBlockComment, FlexerKindLineComment}
- return LexAll(f, skipKinds...)
- }
|