diff options
author | David Beazley <dave@dabeaz.com> | 2016-10-07 11:54:02 -0500 |
---|---|---|
committer | David Beazley <dave@dabeaz.com> | 2016-10-07 11:54:02 -0500 |
commit | 393cc558722eb892724701c110e7ae4c101c88c3 (patch) | |
tree | cd7a77c4e3ba6037a227f8b9eddc1f6b1b451fa6 /ply/yacc.py | |
parent | b515c5fa1003a2a575b5c175831142da94e21ee5 (diff) | |
download | ply-393cc558722eb892724701c110e7ae4c101c88c3.tar.gz |
Fixed issue #101. Incorrect shift/reduce conflict resolution
Diffstat (limited to 'ply/yacc.py')
-rw-r--r-- | ply/yacc.py | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/ply/yacc.py b/ply/yacc.py index 6842832..62ebc88 100644 --- a/ply/yacc.py +++ b/ply/yacc.py @@ -67,8 +67,8 @@ import inspect import base64 import warnings -__version__ = '3.9' -__tabversion__ = '3.8' +__version__ = '3.10' +__tabversion__ = '3.10' #----------------------------------------------------------------------------- # === User configurable parameters === @@ -2585,8 +2585,13 @@ class LRGeneratedTable(LRTable): # Need to decide on shift or reduce here # By default we favor shifting. Need to add # some precedence rules here. - sprec, slevel = Productions[st_actionp[a].number].prec - rprec, rlevel = Precedence.get(a, ('right', 0)) + + # Shift precedence comes from the token + sprec, slevel = Precedence.get(a, ('right', 0)) + + # Reduce precedence comes from rule being reduced (p) + rprec, rlevel = Productions[p.number].prec + if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): # We really need to reduce here. st_action[a] = -p.number @@ -2644,8 +2649,13 @@ class LRGeneratedTable(LRTable): # - if precedence of reduce rule is higher, we reduce. # - if precedence of reduce is same and left assoc, we reduce. # - otherwise we shift - rprec, rlevel = Productions[st_actionp[a].number].prec + + # Shift precedence comes from the token sprec, slevel = Precedence.get(a, ('right', 0)) + + # Reduce precedence comes from the rule that could have been reduced + rprec, rlevel = Productions[st_actionp[a].number].prec + if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')): # We decide to shift here... highest precedence to shift Productions[st_actionp[a].number].reduced -= 1 |