Create loop (dash '^') operator (older asterisk '*')

This commit is contained in:
Bartłomiej Pluta
2019-07-10 23:56:21 +02:00
parent e115c6e33a
commit 10c701ecbf
4 changed files with 27 additions and 11 deletions

View File

@@ -1,5 +1,5 @@
from smnp.ast.node.chain import ChainParser 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.node.valuable import Valuable
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -9,22 +9,36 @@ class Factor(Valuable):
pass pass
powerFactor = Parser.leftAssociativeOperatorParser(ChainParser, [TokenType.DOUBLE_ASTERISK], ChainParser, class Loop(BinaryOperator):
lambda left, op, right: Factor.withValue(BinaryOperator.withValues(left, op, right))) pass
def exprFactor(): def FactorParser(input):
from smnp.ast.node.expression import ExpressionParser 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), Parser.terminalParser(TokenType.OPEN_PAREN),
ExpressionParser, MaxPrecedenceExpressionParser,
Parser.terminalParser(TokenType.CLOSE_PAREN), Parser.terminalParser(TokenType.CLOSE_PAREN),
createNode=lambda open, expr, close: expr createNode=lambda open, expr, close: expr
) )
def FactorParser(input): loopFactor = Parser.allOf(
return Parser.oneOf(
powerFactor, 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) )(input)

View File

@@ -7,7 +7,7 @@ from smnp.program.interpreter import Interpreter
def main(): def main():
try: try:
#stdLibraryEnv = loadStandardLibrary() #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() #draft()
except SmnpException as e: except SmnpException as e:

View File

@@ -33,6 +33,7 @@ tokenizers = (
defaultTokenizer(TokenType.SLASH), defaultTokenizer(TokenType.SLASH),
defaultTokenizer(TokenType.MINUS), defaultTokenizer(TokenType.MINUS),
defaultTokenizer(TokenType.PLUS), defaultTokenizer(TokenType.PLUS),
defaultTokenizer(TokenType.DASH),
defaultTokenizer(TokenType.DOTS), defaultTokenizer(TokenType.DOTS),
defaultTokenizer(TokenType.AMP), defaultTokenizer(TokenType.AMP),
defaultTokenizer(TokenType.DOT), defaultTokenizer(TokenType.DOT),

View File

@@ -19,6 +19,7 @@ class TokenType(Enum):
SLASH = '/' SLASH = '/'
MINUS = '-' MINUS = '-'
PLUS = '+' PLUS = '+'
DASH = '^'
DOTS = '...' DOTS = '...'
AMP = '&' AMP = '&'
DOT = '.' DOT = '.'