Move parentheses in factor before power operator ('**')

This commit is contained in:
Bartłomiej Pluta
2019-07-12 14:50:37 +02:00
parent 1a09a73c91
commit e43b0ad725

View File

@@ -48,15 +48,7 @@ def FactorParser(input):
from smnp.ast.node.statement import StatementParser from smnp.ast.node.statement import StatementParser
from smnp.ast.node.identifier import IdentifierLiteralParser from smnp.ast.node.identifier import IdentifierLiteralParser
powerFactor = Parser.leftAssociativeOperatorParser( parentheses = Parser.allOf(
ChainParser,
[TokenType.DOUBLE_ASTERISK],
ChainParser,
lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right)),
name="power operator"
)
exprFactor = Parser.allOf(
Parser.terminal(TokenType.OPEN_PAREN), Parser.terminal(TokenType.OPEN_PAREN),
ExpressionParser, ExpressionParser,
Parser.terminal(TokenType.CLOSE_PAREN), Parser.terminal(TokenType.CLOSE_PAREN),
@@ -64,15 +56,23 @@ def FactorParser(input):
name="grouping parentheses" name="grouping parentheses"
) )
factorParser = Parser.oneOf( factorOperands = Parser.oneOf(
powerFactor, parentheses,
exprFactor, ChainParser,
name="basic factor" 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( notOperator = Parser.allOf(
Parser.terminal(TokenType.NOT, Operator.withValue), Parser.terminal(TokenType.NOT, Operator.withValue),
factorParser, powerFactor,
createNode=NotOperator.withValues, createNode=NotOperator.withValues,
name="not" name="not"
) )
@@ -88,7 +88,7 @@ def FactorParser(input):
) )
loopFactor = Parser.allOf( loopFactor = Parser.allOf(
factorParser, powerFactor,
Parser.optional(loopParameters), Parser.optional(loopParameters),
Parser.terminal(TokenType.DASH, createNode=Operator.withValue), Parser.terminal(TokenType.DASH, createNode=Operator.withValue),
StatementParser, StatementParser,
@@ -99,5 +99,6 @@ def FactorParser(input):
return Parser.oneOf( return Parser.oneOf(
loopFactor, loopFactor,
notOperator, notOperator,
factorParser powerFactor,
name="factor"
)(input) )(input)