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" )