From 97ebf19e41ac04e50a8a9d09fb1d2611089e03f5 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Mon, 2 Sep 2019 14:43:06 -0500 Subject: [PATCH 1/3] Do not use operator overloading for expression creation in parser --- pymbolic/parser.py | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/pymbolic/parser.py b/pymbolic/parser.py index cf41b4d..0ef93d2 100644 --- a/pymbolic/parser.py +++ b/pymbolic/parser.py @@ -346,30 +346,48 @@ class Parser(object): did_something = True elif next_tag is _plus and _PREC_PLUS > min_precedence: pstate.advance() - left_exp += self.parse_expression(pstate, _PREC_PLUS) + right_exp = self.parse_expression(pstate, _PREC_PLUS) + if isinstance(left_exp, primitives.Sum): + left_exp = primitives.Sum(left_exp.children + (right_exp,)) + else: + left_exp = primitives.Sum((left_exp, right_exp)) + did_something = True elif next_tag is _minus and _PREC_PLUS > min_precedence: pstate.advance() - left_exp -= self.parse_expression(pstate, _PREC_PLUS) + right_exp = self.parse_expression(pstate, _PREC_PLUS) + if isinstance(left_exp, primitives.Sum): + left_exp = primitives.Sum(left_exp.children + (-right_exp,)) + else: + left_exp = primitives.Sum((left_exp, -right_exp)) did_something = True elif next_tag is _times and _PREC_TIMES > min_precedence: pstate.advance() - left_exp *= self.parse_expression(pstate, _PREC_TIMES) + right_exp = self.parse_expression(pstate, _PREC_PLUS) + if isinstance(left_exp, primitives.Product): + left_exp = primitives.Product(left_exp.children + (right_exp,)) + else: + left_exp = primitives.Product((left_exp, right_exp)) did_something = True elif next_tag is _floordiv and _PREC_TIMES > min_precedence: pstate.advance() - left_exp //= self.parse_expression(pstate, _PREC_TIMES) + left_exp = primitives.FloorDiv( + left_exp, self.parse_expression(pstate, _PREC_TIMES)) did_something = True elif next_tag is _over and _PREC_TIMES > min_precedence: pstate.advance() - left_exp /= self.parse_expression(pstate, _PREC_TIMES) + left_exp = primitives.Quotient( + left_exp, self.parse_expression(pstate, _PREC_TIMES)) did_something = True elif next_tag is _modulo and _PREC_TIMES > min_precedence: pstate.advance() - left_exp %= self.parse_expression(pstate, _PREC_TIMES) + left_exp = primitives.Remainder( + left_exp, self.parse_expression(pstate, _PREC_TIMES)) did_something = True elif next_tag is _power and _PREC_POWER > min_precedence: pstate.advance() + left_exp = primitives.Power( + left_exp, self.parse_expression(pstate, _PREC_TIMES)) left_exp **= self.parse_expression(pstate, _PREC_POWER) did_something = True elif next_tag is _and and _PREC_LOGICAL_AND > min_precedence: -- GitLab From d1d1df9cb4150a9beae992edc5a17d78fa517e6d Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Mon, 2 Sep 2019 15:01:10 -0500 Subject: [PATCH 2/3] Fix parser non-overloading --- pymbolic/parser.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pymbolic/parser.py b/pymbolic/parser.py index 0ef93d2..1e54a31 100644 --- a/pymbolic/parser.py +++ b/pymbolic/parser.py @@ -357,7 +357,7 @@ class Parser(object): pstate.advance() right_exp = self.parse_expression(pstate, _PREC_PLUS) if isinstance(left_exp, primitives.Sum): - left_exp = primitives.Sum(left_exp.children + (-right_exp,)) + left_exp = primitives.Sum(left_exp.children + ((-right_exp),)) else: left_exp = primitives.Sum((left_exp, -right_exp)) did_something = True @@ -388,7 +388,6 @@ class Parser(object): pstate.advance() left_exp = primitives.Power( left_exp, self.parse_expression(pstate, _PREC_TIMES)) - left_exp **= self.parse_expression(pstate, _PREC_POWER) did_something = True elif next_tag is _and and _PREC_LOGICAL_AND > min_precedence: pstate.advance() -- GitLab From 8c2d5de1946b70c9cef5917efb65e6018ff92cb2 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Mon, 2 Sep 2019 15:10:25 -0500 Subject: [PATCH 3/3] Add comments to work around confused pylint --- pymbolic/parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymbolic/parser.py b/pymbolic/parser.py index 1e54a31..85f75af 100644 --- a/pymbolic/parser.py +++ b/pymbolic/parser.py @@ -357,9 +357,9 @@ class Parser(object): pstate.advance() right_exp = self.parse_expression(pstate, _PREC_PLUS) if isinstance(left_exp, primitives.Sum): - left_exp = primitives.Sum(left_exp.children + ((-right_exp),)) + left_exp = primitives.Sum(left_exp.children + ((-right_exp),)) # noqa pylint:disable=invalid-unary-operand-type else: - left_exp = primitives.Sum((left_exp, -right_exp)) + left_exp = primitives.Sum((left_exp, -right_exp)) # noqa pylint:disable=invalid-unary-operand-type did_something = True elif next_tag is _times and _PREC_TIMES > min_precedence: pstate.advance() -- GitLab