diff --git a/smnp/ast/node/chain.py b/smnp/ast/node/chain.py index f3d9a8b..59ec56d 100644 --- a/smnp/ast/node/chain.py +++ b/smnp/ast/node/chain.py @@ -1,7 +1,7 @@ from smnp.ast.node.atom import AtomParser from smnp.ast.node.list import ListParser from smnp.ast.node.map import MapParser -from smnp.ast.node.operator import BinaryOperator +from smnp.ast.node.operator import BinaryOperator, UnaryOperator, Operator from smnp.ast.node.valuable import Valuable from smnp.ast.parser import Parser from smnp.token.type import TokenType @@ -11,17 +11,33 @@ class Chain(Valuable): pass +class MinusOperator(UnaryOperator): + pass + + def ChainParser(input): - itemParser = Parser.oneOf( + chain1 = Parser.oneOf( ListParser, MapParser, AtomParser, ) + minusOperator = Parser.allOf( + Parser.terminal(TokenType.MINUS, createNode=Operator.withValue), + chain1, + createNode=MinusOperator.withValues, + name="minus" + ) + + chain2 = Parser.oneOf( + minusOperator, + chain1 + ) + return Parser.leftAssociativeOperatorParser( - itemParser, + chain2, [TokenType.DOT], - itemParser, + chain2, lambda left, op, right: Chain.withValue(BinaryOperator.withValues(left, op, right)) )(input) diff --git a/smnp/ast/node/factor.py b/smnp/ast/node/factor.py index bbea8b0..25e231d 100644 --- a/smnp/ast/node/factor.py +++ b/smnp/ast/node/factor.py @@ -12,6 +12,7 @@ class Factor(Valuable): class NotOperator(UnaryOperator): pass + class Loop(BinaryOperator): pass