aboutsummaryrefslogtreecommitdiff
path: root/driver/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'driver/parser.go')
-rw-r--r--driver/parser.go14
1 files changed, 9 insertions, 5 deletions
diff --git a/driver/parser.go b/driver/parser.go
index 1e7af29..af257e2 100644
--- a/driver/parser.go
+++ b/driver/parser.go
@@ -85,20 +85,22 @@ ACTION_LOOP:
case act < 0: // Shift
nextState := act * -1
+ recovered := false
if p.onError {
+ p.shiftCount++
+
// When the parser performs shift three times, the parser recovers from the error state.
- if p.shiftCount < 3 {
- p.shiftCount++
- } else {
+ if p.shiftCount >= 3 {
p.onError = false
p.shiftCount = 0
+ recovered = true
}
}
p.shift(nextState)
if p.semAct != nil {
- p.semAct.Shift(tok)
+ p.semAct.Shift(tok, recovered)
}
tok, err = p.nextToken()
@@ -108,9 +110,11 @@ ACTION_LOOP:
case act > 0: // Reduce
prodNum := act
+ recovered := false
if p.onError && p.gram.ParsingTable.RecoverProductions[prodNum] != 0 {
p.onError = false
p.shiftCount = 0
+ recovered = true
}
accepted := p.reduce(prodNum)
@@ -123,7 +127,7 @@ ACTION_LOOP:
}
if p.semAct != nil {
- p.semAct.Reduce(prodNum)
+ p.semAct.Reduce(prodNum, recovered)
}
default: // Error
if p.onError {