summaryrefslogtreecommitdiff
path: root/ply/yacc.py
diff options
context:
space:
mode:
authorDavid Beazley <dave@dabeaz.com>2016-10-07 11:54:02 -0500
committerDavid Beazley <dave@dabeaz.com>2016-10-07 11:54:02 -0500
commit393cc558722eb892724701c110e7ae4c101c88c3 (patch)
treecd7a77c4e3ba6037a227f8b9eddc1f6b1b451fa6 /ply/yacc.py
parentb515c5fa1003a2a575b5c175831142da94e21ee5 (diff)
downloadply-393cc558722eb892724701c110e7ae4c101c88c3.tar.gz
Fixed issue #101. Incorrect shift/reduce conflict resolution
Diffstat (limited to 'ply/yacc.py')
-rw-r--r--ply/yacc.py20
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