I'm building a simple language parser, and having an issue with lower precedence prefix expressions. Here's an example grammar:
E = E5
E5 = E4 'OR' E4 | E4
E4 = E3 'AND' E3 | E3
E3 = 'NOT' E3 | E2
E2 = E1 '==' E1 | E1
E1 = '(' E ')' | 'true' | 'false'
However, this grammar doesn't work correctly for the NOT
, if it's used as the RHS of a higher precedence infix operator, i.e.:
true == NOT false
This is due to the ==
operator requiring E1 on the RHS, which cannot be a NOT operation.
I'm unsure the correct way to express this grammar? Is it still possible using this simplistic recursive descent approach, or will I need to move to a more featured algorithm (shunting yard or precedence climbing).
true == (NOT false)
does parse, due to the explicit parenthesis rule that restarts the evaluation from the top level. – Chris LeishmanE = E5 E5 = 'OR' E4 E4 | E4 E4 = 'AND' E3 E3 | E3 E3 = 'NOT' E3 | E2 E2 = '==' E1 E1 | E1 E1 = '(' E ')' | 'true' | 'false'
– user2746020E == not E
. – Chris Leishman