Create evaluator for sum (sum, subtraction and string concatenation)

This commit is contained in:
Bartłomiej Pluta
2019-07-12 20:56:42 +02:00
parent 1094c071fb
commit dc3387c685
3 changed files with 60 additions and 6 deletions

View File

@@ -1,11 +1,22 @@
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):
class Sum(BinaryOperator):
pass
class Relation(BinaryOperator):
pass
class And(BinaryOperator):
pass
class Or(BinaryOperator):
pass
@@ -16,28 +27,28 @@ def ExpressionParser(input):
TermParser,
[TokenType.PLUS, TokenType.MINUS],
TermParser,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
lambda left, op, right: Sum.withValues(left, op, right)
)
expr2 = Parser.leftAssociativeOperatorParser(
expr1,
[TokenType.RELATION, TokenType.OPEN_ANGLE, TokenType.CLOSE_ANGLE],
expr1,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
lambda left, op, right: Relation.withValues(left, op, right)
)
expr3 = Parser.leftAssociativeOperatorParser(
expr2,
[TokenType.AND],
expr2,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
lambda left, op, right: And.withValues(left, op, right)
)
expr4 = Parser.leftAssociativeOperatorParser(
expr3,
[TokenType.OR],
expr3,
lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))
lambda left, op, right: Or.withValues(left, op, right)
)
ifElseExpression = Parser.allOf(