flexer_parser.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334
  1. package flexgen
  2. import . "src.eruta.nl/beoran/ll1/common"
  3. import "src.eruta.nl/beoran/ll1/flexer"
  4. import "src.eruta.nl/beoran/ll1/ast"
  5. import . "src.eruta.nl/beoran/ll1/grammar"
  6. import "src.eruta.nl/beoran/ll1/parser"
  7. func MakeFlexerGrammar() *Grammar {
  8. g := &Grammar{}
  9. keywordsRef := g.AddRule(Ref("keywordsRef", "keywords"))
  10. dot := g.AddRule(Term("dot", FlexgenKindDot))
  11. terminal := g.AddRule(Term("terminal", FlexgenKindTerminal))
  12. arrow := g.AddRule(Term("arrow", FlexgenKindArrow))
  13. keyword := g.AddRule(Term("arrow", FlexgenKindKeyword))
  14. keywords := g.AddRule(Opt("keywords", "", And(keyword, keywordsRef)))
  15. literalString := g.AddRule(Term("literalString", FlexgenKindLiteralString))
  16. literalRaw := g.AddRule(Term("literalRaw", FlexgenKindLiteralRaw))
  17. literalChar := g.AddRule(Term("literalChar", FlexgenKindLiteralChar))
  18. pattern := g.AddRule(Alt("pattern", "", literalString, literalRaw, literalChar))
  19. lexeme := g.AddRule(Seq("lexeme", "", terminal, arrow, pattern, keywords, dot))
  20. lexemes := g.AddRule(Seq("lexemes", "", lexeme, End{}))
  21. top := g.AddRule(Alt("top", "", lexemes))
  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. }