diff --git a/pymbolic/parser.py b/pymbolic/parser.py index cb4cb621..4c5120f8 100644 --- a/pymbolic/parser.py +++ b/pymbolic/parser.py @@ -39,6 +39,8 @@ _closebracket = intern("closebracket") _true = intern("True") _false = intern("False") +_inf = intern("inf") +_nan = intern("nan") _identifier = intern("identifier") _whitespace = intern("whitespace") _comma = intern("comma") @@ -168,6 +170,8 @@ class Parser: (_closebracket, pytools.lex.RE(r"\]")), (_true, pytools.lex.RE(r"True")), (_false, pytools.lex.RE(r"False")), + (_inf, pytools.lex.RE(r"inf")), + (_nan, pytools.lex.RE(r"nan")), (_identifier, pytools.lex.RE(r"[@$a-z_A-Z_][@$a-zA-Z_0-9]*")), (_whitespace, pytools.lex.RE("[ \n\t]*")), (_comma, pytools.lex.RE(",")), @@ -203,6 +207,14 @@ def parse_terminal(self, pstate): elif next_tag is _false: assert pstate.next_str_and_advance() == "False" return False + elif next_tag is _inf: + from math import inf + assert pstate.next_str_and_advance() == "inf" + return inf + elif next_tag is _nan: + from math import nan + assert pstate.next_str_and_advance() == "nan" + return nan elif next_tag is _identifier: return primitives.Variable(pstate.next_str_and_advance()) elif next_tag is _if: diff --git a/test/test_pymbolic.py b/test/test_pymbolic.py index 6f585870..ecab013c 100644 --- a/test/test_pymbolic.py +++ b/test/test_pymbolic.py @@ -291,6 +291,9 @@ def test_parser(): parse("1+if(0, 1, 2)") assert eval(str(parse("1729 if True or False else 42"))) == 1729 + import math + assert math.isinf(parse("inf")) + assert math.isnan(parse("nan")) # }}}