From 10c701ecbf8c792b820e3763e18514ec1a77dec8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Wed, 10 Jul 2019 23:56:21 +0200 Subject: [PATCH] Create loop (dash '^') operator (older asterisk '*') --- smnp/ast/node/factor.py | 34 ++++++++++++++++++++++++---------- smnp/main.py | 2 +- smnp/token/tokenizer.py | 1 + smnp/token/type.py | 1 + 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/smnp/ast/node/factor.py b/smnp/ast/node/factor.py index cf134ba..432d637 100644 --- a/smnp/ast/node/factor.py +++ b/smnp/ast/node/factor.py @@ -1,5 +1,5 @@ from smnp.ast.node.chain import ChainParser -from smnp.ast.node.operator import BinaryOperator +from smnp.ast.node.operator import BinaryOperator, Operator from smnp.ast.node.valuable import Valuable from smnp.ast.parser import Parser from smnp.token.type import TokenType @@ -9,22 +9,36 @@ class Factor(Valuable): pass -powerFactor = Parser.leftAssociativeOperatorParser(ChainParser, [TokenType.DOUBLE_ASTERISK], ChainParser, - lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right))) +class Loop(BinaryOperator): + pass -def exprFactor(): - from smnp.ast.node.expression import ExpressionParser +def FactorParser(input): + from smnp.ast.node.expression import MaxPrecedenceExpressionParser - return Parser.allOf( + powerFactor = Parser.leftAssociativeOperatorParser( + ChainParser, + [TokenType.DOUBLE_ASTERISK], + ChainParser, + lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right)) + ) + + exprFactor = Parser.allOf( Parser.terminalParser(TokenType.OPEN_PAREN), - ExpressionParser, + MaxPrecedenceExpressionParser, Parser.terminalParser(TokenType.CLOSE_PAREN), createNode=lambda open, expr, close: expr ) -def FactorParser(input): - return Parser.oneOf( + loopFactor = Parser.allOf( powerFactor, - exprFactor() + Parser.terminalParser(TokenType.DASH, lambda val, pos: Operator.withValue(val, pos)), + MaxPrecedenceExpressionParser, #TODO statement here + createNode=lambda chain, dash, stmt: Loop.withValues(chain, dash, stmt) + ) + + return Parser.oneOf( + loopFactor, + powerFactor, + exprFactor, )(input) diff --git a/smnp/main.py b/smnp/main.py index d1ed282..51e5ddf 100644 --- a/smnp/main.py +++ b/smnp/main.py @@ -7,7 +7,7 @@ from smnp.program.interpreter import Interpreter def main(): try: #stdLibraryEnv = loadStandardLibrary() - Interpreter.interpretFile(sys.argv[1], printTokens=False, printAst=True, execute=False, baseEnvironment=None) + Interpreter.interpretFile(sys.argv[1], printTokens=True, printAst=True, execute=False, baseEnvironment=None) #draft() except SmnpException as e: diff --git a/smnp/token/tokenizer.py b/smnp/token/tokenizer.py index 0f5f571..b0e3015 100644 --- a/smnp/token/tokenizer.py +++ b/smnp/token/tokenizer.py @@ -33,6 +33,7 @@ tokenizers = ( defaultTokenizer(TokenType.SLASH), defaultTokenizer(TokenType.MINUS), defaultTokenizer(TokenType.PLUS), + defaultTokenizer(TokenType.DASH), defaultTokenizer(TokenType.DOTS), defaultTokenizer(TokenType.AMP), defaultTokenizer(TokenType.DOT), diff --git a/smnp/token/type.py b/smnp/token/type.py index 0beb508..854b412 100644 --- a/smnp/token/type.py +++ b/smnp/token/type.py @@ -19,6 +19,7 @@ class TokenType(Enum): SLASH = '/' MINUS = '-' PLUS = '+' + DASH = '^' DOTS = '...' AMP = '&' DOT = '.'