flexer_lexer.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package flexer
  2. const (
  3. FlexerKindDot = Kind(-1 - iota)
  4. FlexerKindLiteralString
  5. FlexerKindLiteralRaw
  6. FlexerKindLiteralChar
  7. FlexerKindTerminal
  8. FlexerKindArrow
  9. FlexerKindFlexerKeyword
  10. FlexerKindWhitespace
  11. FlexerKindLineComment
  12. FlexerKindBlockComment
  13. FlexerKindFlexerAction
  14. )
  15. /*
  16. // Flexer generator's input own lexer specification
  17. dot -> '\.' .
  18. arrow -> "(?:->|→)" .
  19. terminal -> "[[:isLower:]][[:isAlNum]_-]+" .
  20. literal-string -> `"` flex-esc-string .
  21. literal-raw -> "`" flex-string .
  22. literal-char -> "'" flex-string .
  23. flexer-keyword -> "flex-skip|flex-string|flex-esc-string" .
  24. whitespace -> "[ \t\n\r]+" flex-skip .
  25. line-comment -> "//[^\n\r]+" flex-skip .
  26. block-comment -> "/\*(?ms:.)*?\* /" .
  27. flexer-action -> `%{(?ms:.)*?}%` .
  28. */
  29. type CheckedError struct {
  30. Error error
  31. }
  32. func Check(err error) {
  33. if err != nil {
  34. panic(CheckedError{err})
  35. }
  36. }
  37. func LexFlexerInputString(name, input string) []Token {
  38. f := NewFlexer(name, input)
  39. Check(f.Rule(FlexerKindWhitespace, `[ \t\n\r]+`, "", nil))
  40. Check(f.Rule(FlexerKindLineComment, `//[^\n\r]+[\n\r]+`, "", nil))
  41. Check(f.Rule(FlexerKindBlockComment, `/\*(?ms:.)*?\*/`, "", nil))
  42. Check(f.Rule(FlexerKindDot, `\.`, "", nil))
  43. Check(f.Rule(FlexerKindArrow, `(?:->|→)`, "", nil))
  44. Check(f.Rule(FlexerKindTerminal, `[[:lower:]][[:alnum:]_-]+`, "", nil))
  45. f.EscapedStringRule(FlexerKindLiteralString, `"`, `"`, "literal-string")
  46. f.RawStringRule(FlexerKindLiteralRaw, "`", "`", "literal-raw")
  47. f.RawStringRule(FlexerKindLiteralChar, `''`, `''`, "literal-char")
  48. Check(f.Rule(FlexerKindFlexerKeyword, `flex-skip|flex-string|flex-esc-string`, "", nil))
  49. Check(f.Rule(FlexerKindFlexerAction, `@{(?ms:.)*?}@`, "", nil))
  50. skipKinds := []Kind{SkipKind, FlexerKindWhitespace, FlexerKindBlockComment, FlexerKindLineComment}
  51. return LexAll(f, skipKinds...)
  52. }