From eb86b9bd3d0b25d59eb77e84221a933d741feb26 Mon Sep 17 00:00:00 2001 From: Kaushik Kulkarni <kaushikcfd@gmail.com> Date: Sun, 11 Jul 2021 17:20:57 -0500 Subject: [PATCH] corrects the precedence of 'if-else' node in pymbolic.parse - [minor] also adds parsers for reserved keywords 'True' and 'False' --- pymbolic/parser.py | 12 +++++++++++- test/test_pymbolic.py | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pymbolic/parser.py b/pymbolic/parser.py index b846193..cb4cb62 100644 --- a/pymbolic/parser.py +++ b/pymbolic/parser.py @@ -37,6 +37,8 @@ _openpar = intern("openpar") _closepar = intern("closepar") _openbracket = intern("openbracket") _closebracket = intern("closebracket") +_true = intern("True") +_false = intern("False") _identifier = intern("identifier") _whitespace = intern("whitespace") _comma = intern("comma") @@ -164,6 +166,8 @@ class Parser: (_closepar, pytools.lex.RE(r"\)")), (_openbracket, pytools.lex.RE(r"\[")), (_closebracket, pytools.lex.RE(r"\]")), + (_true, pytools.lex.RE(r"True")), + (_false, pytools.lex.RE(r"False")), (_identifier, pytools.lex.RE(r"[@$a-z_A-Z_][@$a-zA-Z_0-9]*")), (_whitespace, pytools.lex.RE("[ \n\t]*")), (_comma, pytools.lex.RE(",")), @@ -193,6 +197,12 @@ class Parser: return self.parse_float(pstate.next_str_and_advance()) elif next_tag is _imaginary: return complex(pstate.next_str_and_advance()) + elif next_tag is _true: + assert pstate.next_str_and_advance() == "True" + return True + elif next_tag is _false: + assert pstate.next_str_and_advance() == "False" + return False elif next_tag is _identifier: return primitives.Variable(pstate.next_str_and_advance()) elif next_tag is _if: @@ -330,7 +340,7 @@ class Parser: then_expr = left_exp pstate.advance() pstate.expect_not_end() - condition = self.parse_expression(pstate, _PREC_LOGICAL_OR) + condition = self.parse_expression(pstate, _PREC_IF) pstate.expect(_else) pstate.advance() else_expr = self.parse_expression(pstate) diff --git a/test/test_pymbolic.py b/test/test_pymbolic.py index 7908d6b..6f58587 100644 --- a/test/test_pymbolic.py +++ b/test/test_pymbolic.py @@ -290,6 +290,8 @@ def test_parser(): with pytest.deprecated_call(): parse("1+if(0, 1, 2)") + assert eval(str(parse("1729 if True or False else 42"))) == 1729 + # }}} -- GitLab