parser.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Uses an ll1 grammar to parse an input from an ll1 flexer to an Ast.
  2. package parser
  3. // import "fmt"
  4. import . "src.eruta.nl/beoran/ll1/common"
  5. import . "src.eruta.nl/beoran/ll1/ast"
  6. import . "src.eruta.nl/beoran/ll1/grammar"
  7. import . "src.eruta.nl/beoran/ll1/flexer"
  8. // A TokenMapper maps a token to a Species.
  9. type TokenMapper interface {
  10. // Returns the pecies to use for the token. If nil, the token
  11. // may be skipped.
  12. Map(t Token) Species
  13. }
  14. type DefaultMapper struct{}
  15. func (DefaultMapper) Map(t Token) Species {
  16. return MakeSpecies("default")
  17. }
  18. type Parser struct {
  19. Grammar
  20. TokenMapper
  21. Tokens []Token
  22. Index int
  23. Errors []error
  24. Result Ast
  25. // current location in the ast being built.
  26. Now Ast
  27. Recursion int
  28. }
  29. func (p *Parser) MakeError(msg string, args ...interface{}) error {
  30. return MakeErrorToken(p.Token().Location(), msg, args...)
  31. }
  32. func (p *Parser) AddError(msg string, args ...interface{}) error {
  33. err := MakeErrorToken(p.Token().Location(), msg, args...)
  34. p.Errors = append(p.Errors, err)
  35. return err
  36. }
  37. func (g Parser) Token() Token {
  38. if g.Index < len(g.Tokens) {
  39. return g.Tokens[g.Index]
  40. }
  41. last := g.Tokens[len(g.Tokens)-1]
  42. return MakeErrorToken(last.Location(), "Unexpected end of input.")
  43. }
  44. func (g *Parser) Expect(kind Kind) Token {
  45. tok := g.Token()
  46. if tok.Kind() == kind {
  47. g.Index++
  48. return tok
  49. }
  50. return nil
  51. }
  52. func (g *Parser) Accept(kinds ...Kind) Token {
  53. tok := g.Token()
  54. for _, kind := range kinds {
  55. if tok.Kind() == kind {
  56. g.Index++
  57. return tok
  58. }
  59. }
  60. return nil
  61. }
  62. func (g *Parser) Require(kinds ...Kind) Token {
  63. tok := g.Accept(kinds...)
  64. if tok != nil {
  65. return tok
  66. }
  67. g.AddError("Expected: %v", kinds)
  68. return nil
  69. }
  70. func (p *Parser) ParseTerminal(term Terminal) error {
  71. tok := p.Expect(term.Kind)
  72. if tok == nil {
  73. return p.MakeError("Expected token kind: %d", term.Kind)
  74. }
  75. spec := p.Map(tok)
  76. NewChild(p.Now, spec, tok)
  77. // now should alreqdy be of suitable kind to accept a terminal token child.
  78. return nil
  79. }
  80. func (g *Parser) ParseEpsilon(term Epsilon) error {
  81. return nil
  82. }
  83. func (p *Parser) ParseEnd(term End) error {
  84. if p.Index >= len(p.Tokens) {
  85. return nil
  86. } else {
  87. return p.MakeError("Expected end of input.")
  88. }
  89. }
  90. func (p *Parser) PopUp() {
  91. if p.Now != nil && p.Now.Parent() != nil {
  92. p.Now = p.Now.Parent()
  93. }
  94. }
  95. func (p *Parser) ParseSequence(seq Sequence) error {
  96. spec := p.Map(p.Token())
  97. p.Now = NewChild(p.Now, spec, p.Token())
  98. defer p.PopUp()
  99. for _, rule := range seq.Rules {
  100. err := p.ParseRule(rule)
  101. if err != nil {
  102. p.Errors = append(p.Errors, err)
  103. return err
  104. }
  105. }
  106. return nil
  107. }
  108. func (p *Parser) ParseAlternates(alt Alternates) error {
  109. spec := p.Map(p.Token())
  110. p.Now = NewChild(p.Now, spec, p.Token())
  111. defer p.PopUp()
  112. errors := []error{}
  113. for _, rule := range alt.Rules {
  114. err := p.ParseRule(rule)
  115. if err != nil {
  116. errors = append(errors, err)
  117. } else { // one alternate was OK here.
  118. return nil
  119. }
  120. }
  121. // If we get here no alternate was ok.
  122. p.Errors = append(p.Errors, errors...)
  123. return p.MakeError("Could not parse alternate.")
  124. }
  125. func (p *Parser) ParseRule(r Rule) error {
  126. p.Recursion++
  127. if p.Recursion > 800 {
  128. panic("Too much recursion in grammar.")
  129. }
  130. switch rv := r.(type) {
  131. case Epsilon:
  132. p.ParseEpsilon(rv)
  133. case End:
  134. p.ParseEnd(rv)
  135. case Terminal:
  136. p.ParseTerminal(rv)
  137. case Alternates:
  138. p.ParseAlternates(rv)
  139. case Sequence:
  140. p.ParseSequence(rv)
  141. case Reference:
  142. p.ParseReference(rv)
  143. default:
  144. panic("Unknown rule type in ParseRule.")
  145. }
  146. // p.Now.AddChild()
  147. return nil
  148. }
  149. func (p *Parser) Parse(input []Token) error {
  150. p.Tokens = input
  151. p.Recursion = 0
  152. p.Errors = []error{}
  153. p.Result = NewAstNone()
  154. p.Now = p.Result
  155. return p.ParseRule(p.Grammar.Top)
  156. return nil
  157. }