From e43b0ad72574cf82877eacec85d12f4866e83a40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 14:50:37 +0200 Subject: [PATCH] Move parentheses in factor before power operator ('**') --- smnp/ast/node/factor.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/smnp/ast/node/factor.py b/smnp/ast/node/factor.py index f1bd8a5..fcdd708 100644 --- a/smnp/ast/node/factor.py +++ b/smnp/ast/node/factor.py @@ -48,15 +48,7 @@ def FactorParser(input): from smnp.ast.node.statement import StatementParser from smnp.ast.node.identifier import IdentifierLiteralParser - powerFactor = Parser.leftAssociativeOperatorParser( - ChainParser, - [TokenType.DOUBLE_ASTERISK], - ChainParser, - lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right)), - name="power operator" - ) - - exprFactor = Parser.allOf( + parentheses = Parser.allOf( Parser.terminal(TokenType.OPEN_PAREN), ExpressionParser, Parser.terminal(TokenType.CLOSE_PAREN), @@ -64,15 +56,23 @@ def FactorParser(input): name="grouping parentheses" ) - factorParser = Parser.oneOf( - powerFactor, - exprFactor, - name="basic factor" + factorOperands = Parser.oneOf( + parentheses, + ChainParser, + name="factor operands" + ) + + powerFactor = Parser.leftAssociativeOperatorParser( + factorOperands, + [TokenType.DOUBLE_ASTERISK], + factorOperands, + lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right)), + name="power operator" ) notOperator = Parser.allOf( Parser.terminal(TokenType.NOT, Operator.withValue), - factorParser, + powerFactor, createNode=NotOperator.withValues, name="not" ) @@ -88,7 +88,7 @@ def FactorParser(input): ) loopFactor = Parser.allOf( - factorParser, + powerFactor, Parser.optional(loopParameters), Parser.terminal(TokenType.DASH, createNode=Operator.withValue), StatementParser, @@ -99,5 +99,6 @@ def FactorParser(input): return Parser.oneOf( loopFactor, notOperator, - factorParser + powerFactor, + name="factor" )(input)