Skip to content

Commit f7027d6

Browse files
committed
Add parenthesis to the precedence rules
Fixes #70
1 parent 291a515 commit f7027d6

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

lib/rule_engine/parser.py

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -183,25 +183,31 @@ class Parser(ParserBase):
183183
t_ATTR = r'(?<=\S)\.(?=[a-zA-Z_][a-zA-Z0-9_]*)'
184184
t_ATTR_SAFE = r'(?<=\S)&\.(?=[a-zA-Z_][a-zA-Z0-9_]*)'
185185

186-
# tokens are listed from lowest to highest precedence, ones that appear
187-
# later are effectively evaluated first
188-
# see: https://en.wikipedia.org/wiki/Order_of_operations#Programming_languages
189-
precedence = (
190-
('left', 'OR'),
191-
('left', 'AND'),
192-
('right', 'NOT'),
193-
('left', 'BWOR'),
194-
('left', 'BWXOR'),
195-
('left', 'BWAND'),
196-
('right', 'QMARK', 'COLON'),
197-
('nonassoc', 'EQ', 'NE', 'EQ_FZM', 'EQ_FZS', 'NE_FZM', 'NE_FZS', 'GE', 'GT', 'LE', 'LT', 'IN'), # Nonassociative operators
198-
('left', 'ADD', 'SUB'),
199-
('left', 'BWLSH', 'BWRSH'),
200-
('left', 'MUL', 'TDIV', 'FDIV', 'MOD'),
201-
('left', 'POW'),
202-
('right', 'UMINUS'),
203-
('left', 'ATTR', 'ATTR_SAFE'),
204-
)
186+
# Tokens are listed from highest to lowest precedence, ones that appear
187+
# later are effectively evaluated last
188+
# see:
189+
# * https://en.wikipedia.org/wiki/Order_of_operations#Programming_languages
190+
# * https://docs.python.org/3/reference/expressions.html
191+
precedence = tuple(
192+
# reverse the order to lowest to highest for ply
193+
reversed((
194+
('nonassoc', 'LPAREN', 'RPAREN'),
195+
('left', 'ATTR', 'ATTR_SAFE'),
196+
('right', 'UMINUS'),
197+
('left', 'POW'),
198+
('left', 'MUL', 'TDIV', 'FDIV', 'MOD'),
199+
('left', 'BWLSH', 'BWRSH'),
200+
('left', 'ADD', 'SUB'),
201+
('nonassoc', 'EQ', 'NE', 'EQ_FZM', 'EQ_FZS', 'NE_FZM', 'NE_FZS', 'GE', 'GT', 'LE', 'LT', 'IN'), # Nonassociative operators
202+
('right', 'QMARK', 'COLON'),
203+
('left', 'BWAND'),
204+
('left', 'BWXOR'),
205+
('left', 'BWOR'),
206+
('right', 'NOT'),
207+
('left', 'AND'),
208+
('left', 'OR'),
209+
)
210+
))
205211

206212
@classmethod
207213
def get_token_regex(cls, token_name):

0 commit comments

Comments
 (0)