63 lines
1.8 KiB
Python
63 lines
1.8 KiB
Python
from smnp.ast.node.operator import BinaryOperator
|
|
from smnp.ast.node.term import TermParser
|
|
from smnp.ast.node.valuable import Valuable
|
|
from smnp.ast.parser import Parser
|
|
from smnp.token.type import TokenType
|
|
|
|
|
|
class Expression(Valuable):
|
|
pass
|
|
|
|
|
|
def ExpressionParser(input):
|
|
return Parser.leftAssociativeOperatorParser(
|
|
TermParser,
|
|
[TokenType.PLUS, TokenType.MINUS],
|
|
TermParser,
|
|
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
|
|
)(input)
|
|
|
|
|
|
def Expression2Parser(input):
|
|
return Parser.leftAssociativeOperatorParser(
|
|
ExpressionParser,
|
|
[TokenType.RELATION],
|
|
ExpressionParser,
|
|
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
|
|
)(input)
|
|
|
|
|
|
def Expression3Parser(input):
|
|
return Parser.leftAssociativeOperatorParser(
|
|
Expression2Parser,
|
|
[TokenType.AND],
|
|
Expression2Parser,
|
|
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
|
|
)(input)
|
|
|
|
|
|
def Expression4Parser(input):
|
|
from smnp.ast.node.condition import IfElse
|
|
exprParser = Parser.leftAssociativeOperatorParser(
|
|
Expression3Parser,
|
|
[TokenType.OR],
|
|
Expression3Parser,
|
|
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
|
|
)
|
|
|
|
ifElseExpression = Parser.allOf(
|
|
exprParser,
|
|
Parser.terminalParser(TokenType.IF),
|
|
Expression4Parser,
|
|
Parser.terminalParser(TokenType.ELSE),
|
|
Expression4Parser,
|
|
createNode=lambda ifNode, _, condition, __, elseNode: IfElse.createNode(ifNode, condition, elseNode)
|
|
)
|
|
|
|
return Parser.oneOf(
|
|
ifElseExpression,
|
|
exprParser,
|
|
)(input)
|
|
|
|
|
|
MaxPrecedenceExpressionParser = Expression4Parser |