From 0cefcd282b89420ec27f08fd2001e1e26556dc35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 00:51:37 +0200 Subject: [PATCH] Improve minus operator --- smnp/ast/node/chain.py | 24 ++++++++++++++++++++---- smnp/ast/node/factor.py | 1 + 2 files changed, 21 insertions(+), 4 deletions(-) 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