parser.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Code generated by gocc; DO NOT EDIT.
  2. package parser
  3. import (
  4. "bytes"
  5. "fmt"
  6. parseError "github.com/awalterschulze/gographviz/internal/errors"
  7. "github.com/awalterschulze/gographviz/internal/token"
  8. )
  9. const (
  10. numProductions = 60
  11. numStates = 128
  12. numSymbols = 36
  13. )
  14. // Stack
  15. type stack struct {
  16. state []int
  17. attrib []Attrib
  18. }
  19. const iNITIAL_STACK_SIZE = 100
  20. func newStack() *stack {
  21. return &stack{
  22. state: make([]int, 0, iNITIAL_STACK_SIZE),
  23. attrib: make([]Attrib, 0, iNITIAL_STACK_SIZE),
  24. }
  25. }
  26. func (s *stack) reset() {
  27. s.state = s.state[:0]
  28. s.attrib = s.attrib[:0]
  29. }
  30. func (s *stack) push(state int, a Attrib) {
  31. s.state = append(s.state, state)
  32. s.attrib = append(s.attrib, a)
  33. }
  34. func (s *stack) top() int {
  35. return s.state[len(s.state)-1]
  36. }
  37. func (s *stack) peek(pos int) int {
  38. return s.state[pos]
  39. }
  40. func (s *stack) topIndex() int {
  41. return len(s.state) - 1
  42. }
  43. func (s *stack) popN(items int) []Attrib {
  44. lo, hi := len(s.state)-items, len(s.state)
  45. attrib := s.attrib[lo:hi]
  46. s.state = s.state[:lo]
  47. s.attrib = s.attrib[:lo]
  48. return attrib
  49. }
  50. func (s *stack) String() string {
  51. w := new(bytes.Buffer)
  52. fmt.Fprintf(w, "stack:\n")
  53. for i, st := range s.state {
  54. fmt.Fprintf(w, "\t%d: %d , ", i, st)
  55. if s.attrib[i] == nil {
  56. fmt.Fprintf(w, "nil")
  57. } else {
  58. switch attr := s.attrib[i].(type) {
  59. case *token.Token:
  60. fmt.Fprintf(w, "%s", attr.Lit)
  61. default:
  62. fmt.Fprintf(w, "%v", attr)
  63. }
  64. }
  65. fmt.Fprintf(w, "\n")
  66. }
  67. return w.String()
  68. }
  69. // Parser
  70. type Parser struct {
  71. stack *stack
  72. nextToken *token.Token
  73. pos int
  74. }
  75. type Scanner interface {
  76. Scan() (tok *token.Token)
  77. }
  78. func NewParser() *Parser {
  79. p := &Parser{stack: newStack()}
  80. p.Reset()
  81. return p
  82. }
  83. func (p *Parser) Reset() {
  84. p.stack.reset()
  85. p.stack.push(0, nil)
  86. }
  87. func (p *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) {
  88. errorAttrib = &parseError.Error{
  89. Err: err,
  90. ErrorToken: p.nextToken,
  91. ErrorSymbols: p.popNonRecoveryStates(),
  92. ExpectedTokens: make([]string, 0, 8),
  93. }
  94. for t, action := range actionTab[p.stack.top()].actions {
  95. if action != nil {
  96. errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t)))
  97. }
  98. }
  99. if action := actionTab[p.stack.top()].actions[token.TokMap.Type("error")]; action != nil {
  100. p.stack.push(int(action.(shift)), errorAttrib) // action can only be shift
  101. } else {
  102. return
  103. }
  104. if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil {
  105. recovered = true
  106. }
  107. for !recovered && p.nextToken.Type != token.EOF {
  108. p.nextToken = scanner.Scan()
  109. if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil {
  110. recovered = true
  111. }
  112. }
  113. return
  114. }
  115. func (p *Parser) popNonRecoveryStates() (removedAttribs []parseError.ErrorSymbol) {
  116. if rs, ok := p.firstRecoveryState(); ok {
  117. errorSymbols := p.stack.popN(p.stack.topIndex() - rs)
  118. removedAttribs = make([]parseError.ErrorSymbol, len(errorSymbols))
  119. for i, e := range errorSymbols {
  120. removedAttribs[i] = e
  121. }
  122. } else {
  123. removedAttribs = []parseError.ErrorSymbol{}
  124. }
  125. return
  126. }
  127. // recoveryState points to the highest state on the stack, which can recover
  128. func (p *Parser) firstRecoveryState() (recoveryState int, canRecover bool) {
  129. recoveryState, canRecover = p.stack.topIndex(), actionTab[p.stack.top()].canRecover
  130. for recoveryState > 0 && !canRecover {
  131. recoveryState--
  132. canRecover = actionTab[p.stack.peek(recoveryState)].canRecover
  133. }
  134. return
  135. }
  136. func (p *Parser) newError(err error) error {
  137. e := &parseError.Error{
  138. Err: err,
  139. StackTop: p.stack.top(),
  140. ErrorToken: p.nextToken,
  141. }
  142. actRow := actionTab[p.stack.top()]
  143. for i, t := range actRow.actions {
  144. if t != nil {
  145. e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i)))
  146. }
  147. }
  148. return e
  149. }
  150. func (p *Parser) Parse(scanner Scanner) (res interface{}, err error) {
  151. p.Reset()
  152. p.nextToken = scanner.Scan()
  153. for acc := false; !acc; {
  154. action := actionTab[p.stack.top()].actions[p.nextToken.Type]
  155. if action == nil {
  156. if recovered, errAttrib := p.Error(nil, scanner); !recovered {
  157. p.nextToken = errAttrib.ErrorToken
  158. return nil, p.newError(nil)
  159. }
  160. if action = actionTab[p.stack.top()].actions[p.nextToken.Type]; action == nil {
  161. panic("Error recovery led to invalid action")
  162. }
  163. }
  164. switch act := action.(type) {
  165. case accept:
  166. res = p.stack.popN(1)[0]
  167. acc = true
  168. case shift:
  169. p.stack.push(int(act), p.nextToken)
  170. p.nextToken = scanner.Scan()
  171. case reduce:
  172. prod := productionsTable[int(act)]
  173. attrib, err := prod.ReduceFunc(p.stack.popN(prod.NumSymbols))
  174. if err != nil {
  175. return nil, p.newError(err)
  176. } else {
  177. p.stack.push(gotoTab[p.stack.top()][prod.NTType], attrib)
  178. }
  179. default:
  180. panic("unknown action: " + action.String())
  181. }
  182. }
  183. return res, nil
  184. }