flexer_parser.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. package flexgen
  2. import . "src.eruta.nl/beoran/ll1/grammar"
  3. import "src.eruta.nl/beoran/ll1/parser"
  4. func MakeFlexerGrammar() *Grammar {
  5. g := NewGrammar()
  6. dot := g.Term("dot", FlexgenKindDot)
  7. terminal := g.Term("terminal", FlexgenKindTerminal)
  8. arrow := g.Term("arrow", FlexgenKindArrow)
  9. action := g.Term("action", FlexgenKindAction)
  10. keyword := g.Term("keyword", FlexgenKindKeyword)
  11. keywordsRef := g.Ref("keywordsRef", "keywords")
  12. keywords := g.Opt("keywords", "", And(keyword, keywordsRef))
  13. literalString := g.Term("literalString", FlexgenKindLiteralString)
  14. literalRaw := g.Term("literalRaw", FlexgenKindLiteralRaw)
  15. literalChar := g.Term("literalChar", FlexgenKindLiteralChar)
  16. pattern := g.Alt("pattern", "", literalString, literalRaw, literalChar)
  17. optAction := g.Opt("optAction", "", action)
  18. lexeme := g.Seq("lexeme", "", terminal, arrow, pattern, keywords, optAction, dot)
  19. lexemesRef := g.Ref("lexemesRef", "lexemes")
  20. lexemes := g.Opt("lexemes", "", And(lexeme, lexemesRef))
  21. top := g.Seq("top", "", lexemes, End())
  22. g.Top = top
  23. return g
  24. }
  25. /* Parser for the flexer lexer . */
  26. func MakeFlexerParser() *parser.Parser {
  27. p := &parser.Parser{}
  28. p.TokenMapper = parser.DefaultMapper{}
  29. p.Grammar = *MakeFlexerGrammar()
  30. return p
  31. }