func (P *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) { errorAttrib = &parseError.Error{ Err: err, ErrorToken: P.nextToken, ErrorSymbols: P.popNonRecoveryStates(), ExpectedTokens: make([]string, 0, 8), } for t, action := range actionTab[P.stack.top()].actions { if action != nil { errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t))) } } if action := actionTab[P.stack.top()].actions[token.TokMap.Type("error")]; action != nil { P.stack.push(int(action.(shift)), errorAttrib) // action can only be shift } else { return } if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { recovered = true } for !recovered && P.nextToken.Type != token.EOF { P.nextToken = scanner.Scan() if action := actionTab[P.stack.top()].actions[P.nextToken.Type]; action != nil { recovered = true } } return }
func (P *Parser) newError(err error) error { e := &parseError.Error{ Err: err, StackTop: P.stack.top(), ErrorToken: P.nextToken, } actRow := actionTab[P.stack.top()] for i, t := range actRow.actions { if t != nil { e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i))) } } return e }