diff --git a/smnp/ast/node/expression.py b/smnp/ast/node/expression.py index 70fa201..40fc7e7 100644 --- a/smnp/ast/node/expression.py +++ b/smnp/ast/node/expression.py @@ -14,6 +14,14 @@ ExpressionParser = Parser.leftAssociativeOperatorParser(TermParser, [TokenType.P Expression2Parser = Parser.leftAssociativeOperatorParser(ExpressionParser, [TokenType.RELATION], ExpressionParser, lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))) +Expression3Parser = Parser.leftAssociativeOperatorParser(Expression2Parser, [TokenType.AND], Expression2Parser, + lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))) + +Expression4Parser = Parser.leftAssociativeOperatorParser(Expression3Parser, [TokenType.OR], Expression3Parser, + lambda left, op, right: Expression.withValue(BinaryOperator.withValues(left, op, right))) + +MaxPrecedenceExpressionParser = Expression4Parser + # # class ExpressionNode(Node): # def __init__(self, pos): diff --git a/smnp/ast/node/program.py b/smnp/ast/node/program.py index 31dae96..157cf1b 100644 --- a/smnp/ast/node/program.py +++ b/smnp/ast/node/program.py @@ -1,4 +1,4 @@ -from smnp.ast.node.expression import Expression2Parser +from smnp.ast.node.expression import MaxPrecedenceExpressionParser from smnp.ast.node.model import Node, ParseResult from smnp.ast.parser import Parser @@ -15,7 +15,7 @@ def parse(input): #TODO -> temporary (to remove): - Expression2Parser + MaxPrecedenceExpressionParser )(input) if result.result: diff --git a/smnp/token/tokenizer.py b/smnp/token/tokenizer.py index 4969a07..9abaa06 100644 --- a/smnp/token/tokenizer.py +++ b/smnp/token/tokenizer.py @@ -49,7 +49,10 @@ tokenizers = ( separated(defaultTokenizer(TokenType.EXTEND)), separated(defaultTokenizer(TokenType.IMPORT)), separated(defaultTokenizer(TokenType.FROM)), + separated(defaultTokenizer(TokenType.AND)), + separated(defaultTokenizer(TokenType.NOT)), separated(defaultTokenizer(TokenType.AS)), + separated(defaultTokenizer(TokenType.OR)), # Identifier (couldn't be before keywords!) identifierTokenizer, diff --git a/smnp/token/type.py b/smnp/token/type.py index 749bd1c..0beb508 100644 --- a/smnp/token/type.py +++ b/smnp/token/type.py @@ -22,6 +22,9 @@ class TokenType(Enum): DOTS = '...' AMP = '&' DOT = '.' + AND = 'and' + OR = 'or' + NOT = 'not' INTEGER = 'integer' STRING = 'string' NOTE = 'note'