parser.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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 species to use for the grammar rule. If nil, the token
  11. // may be skipped.
  12. Map(t Rule) Species
  13. }
  14. type DefaultMapper struct{}
  15. func (DefaultMapper) Map(r Rule) Species {
  16. return MakeSpecies(r.Name())
  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(term)
  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) ParseReference(ref Reference) error {
  96. rule, err := ref.Resolve()
  97. if err != nil {
  98. return err
  99. }
  100. return p.ParseRule(rule)
  101. }
  102. func (p *Parser) ParseSequence(seq Sequence) error {
  103. spec := p.Map(seq)
  104. p.Now = NewChild(p.Now, spec, p.Token())
  105. defer p.PopUp()
  106. for _, rule := range seq.Rules {
  107. err := p.ParseRule(rule)
  108. if err != nil {
  109. p.Errors = append(p.Errors, err)
  110. return err
  111. }
  112. }
  113. return nil
  114. }
  115. /*
  116. func (p *Parser) ParseOptinalAlternates(alt Alternates) error {
  117. for _, rule := range alt.Rules {
  118. if IsReference(rule) {
  119. }
  120. err := p.ParseRule(rule)
  121. if err != nil {
  122. errors = append(errors, err)
  123. } else { // one alternate was OK here.
  124. return nil
  125. }
  126. }
  127. // If we get here no alternate was ok.
  128. p.Errors = append(p.Errors, errors...)
  129. return p.MakeError("Could not parse alternate.")
  130. }
  131. */
  132. func (p *Parser) ParseAlternates(alt Alternates) error {
  133. spec := p.Map(alt)
  134. p.Now = NewChild(p.Now, spec, p.Token())
  135. defer p.PopUp()
  136. errors := []error{}
  137. hasEpsilon := false
  138. for _, rule := range alt.Rules {
  139. if IsEpsilon(rule) {
  140. hasEpsilon = true
  141. } else {
  142. first, _ := rule.FirstSet()
  143. if first.ContainsKind(p.Token().Kind()) {
  144. err := p.ParseRule(rule)
  145. if err != nil {
  146. errors = append(errors, err)
  147. } else { // this alternate was OK here.
  148. return nil
  149. }
  150. }
  151. }
  152. }
  153. if hasEpsilon { // No match is ok.
  154. return nil
  155. }
  156. // If we get here no alternate was ok.
  157. p.Errors = append(p.Errors, errors...)
  158. return p.MakeError("Could not parse alternate.")
  159. }
  160. func (p *Parser) ParseRule(r Rule) error {
  161. p.Recursion++
  162. if p.Recursion > 800 {
  163. panic("Too much recursion in grammar.")
  164. }
  165. switch rv := r.(type) {
  166. case Epsilon:
  167. p.ParseEpsilon(rv)
  168. case End:
  169. p.ParseEnd(rv)
  170. case Terminal:
  171. p.ParseTerminal(rv)
  172. case Alternates:
  173. p.ParseAlternates(rv)
  174. case Sequence:
  175. p.ParseSequence(rv)
  176. case Reference:
  177. p.ParseReference(rv)
  178. default:
  179. panic("Unknown rule type in ParseRule.")
  180. }
  181. // p.Now.AddChild()
  182. return nil
  183. }
  184. func (p *Parser) Parse(input []Token) error {
  185. p.Tokens = input
  186. p.Recursion = 0
  187. p.Errors = []error{}
  188. p.Result = NewAstNone()
  189. p.Now = p.Result
  190. return p.ParseRule(p.Grammar.Top)
  191. return nil
  192. }