From 5a2508e80412839a26dbec764b8567923c69615b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Tue, 16 Jul 2019 10:23:30 +0200 Subject: [PATCH] Move parenthesed expression to atom --- smnp/ast/node/atom.py | 10 ++++++++++ smnp/ast/node/factor.py | 19 ++----------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/smnp/ast/node/atom.py b/smnp/ast/node/atom.py index 4b53b6d..95eda19 100644 --- a/smnp/ast/node/atom.py +++ b/smnp/ast/node/atom.py @@ -78,8 +78,18 @@ def AtomParser(input): from smnp.ast.node.identifier import IdentifierParser from smnp.ast.node.list import ListParser from smnp.ast.node.map import MapParser + from smnp.ast.node.expression import ExpressionParser + + parentheses = Parser.allOf( + Parser.terminal(TokenType.OPEN_PAREN), + Parser.doAssert(ExpressionParser, "expression"), + Parser.terminal(TokenType.CLOSE_PAREN), + createNode=lambda open, expr, close: expr, + name="grouping parentheses" + ) return Parser.oneOf( + parentheses, LiteralParser, IdentifierParser, ListParser, diff --git a/smnp/ast/node/factor.py b/smnp/ast/node/factor.py index 404a4f3..7d9ac98 100644 --- a/smnp/ast/node/factor.py +++ b/smnp/ast/node/factor.py @@ -11,26 +11,11 @@ class Power(BinaryOperator): pass def FactorParser(input): - from smnp.ast.node.expression import ExpressionParser - - parentheses = Parser.allOf( - Parser.terminal(TokenType.OPEN_PAREN), - Parser.doAssert(ExpressionParser, "expression"), - Parser.terminal(TokenType.CLOSE_PAREN), - createNode=lambda open, expr, close: expr, - name="grouping parentheses" - ) - - factorOperands = Parser.oneOf( - parentheses, - UnitParser, - name="factor operands" - ) powerFactor = Parser.leftAssociativeOperatorParser( - factorOperands, + UnitParser, [TokenType.DOUBLE_ASTERISK], - factorOperands, + UnitParser, lambda left, op, right: Power.withValues(left, op, right), name="power operator" )