Redundancy/conflicts in expression rules.

Iain Buclaw ibuclaw at gdcproject.org
Wed Feb 12 16:00:10 PST 2014


This might be because the rules I have in place are not complete 
(I'm not implementing a complete D expression parser), but I have 
my doubts on this, and currently leaning on a possible problem in 
the documentation.


I've built up rules in yacc based on what's documented here: 
http://dlang.org/expression.html

However I seem to be getting shift/reduce conflicts around:

AndAndExpression:
         OrExpression
|       AndAndExpression && OrExpression
         CmpExpression
|       AndAndExpression && CmpExpression
;

OrExpression:
         XorExpression
|       OrExpression | XorExpression
;

XorExpression:
         AndExpression
|       XorExpression ^ AndExpression
;

AndExpression:
         ShiftExpression
|       AndExpression & ShiftExpression
;

CmpExpression:
         ShiftExpression
|       EqualExpression
|       IdentityExpression
|       RelExpression
;

CmpExpression:
         ShiftExpression
|       EqualExpression
|       IdentityExpression
|       RelExpression
;


---
Conflict between 'XorExpression: XorExpression '^' AndExpression' 
and token '&'
Conflict between 'ShiftExpression: ShiftExpression RSH 
AddExpression' and token '+'
Conflict between 'ShiftExpression: ShiftExpression RSH 
AddExpression' and token '-'
Conflict between 'ShiftExpression: ShiftExpression LSH 
AddExpression' and token '+'
Conflict between 'ShiftExpression: ShiftExpression LSH 
AddExpression' and token '-'
Conflict between 'AddExpression: AddExpression '+' MulExpression' 
and token '*'
Conflict between 'AddExpression: AddExpression '-' MulExpression' 
and token '*'
---


It's not too much of a problem, I can tweak it (so it follows 
same-ish rules as Java) and it will pass just fine:

AndAndExpression:
         OrExpression
|       AndAndExpression && OrExpression
;

OrExpression:
         XorExpression
|       OrExpression | XorExpression
;

XorExpression:
         AndExpression
|       XorExpression ^ AndExpression
;

AndExpression:
         CmpExpression
|       AndExpression & CmpExpression
;

CmpExpression:
         ShiftExpression
|       EqualExpression
|       IdentityExpression
|       RelExpression
;


I'm just curious if anyone else has stumbled onto this, and 
whether or not it's just human error on my part.  :o)

Regards
Iain.


More information about the Digitalmars-d mailing list