diff --git a/pymbolic/parser.py b/pymbolic/parser.py index b846193d6dfb312c6c249d6f95ca5af5b638b20e..cb4cb621015c1adf9fb43d5dafae16ba9257ea1a 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 7908d6b09c56bc0b7507e3574e698af7985b0ce7..6f585870a63185c3bd88c25c21218152c50292de 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 + # }}}