From 2ecc86a9b23e910ab51a0390093fe7addba30073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 5 Jul 2019 23:33:28 +0200 Subject: [PATCH] Add support for assignment --- smnp/newast/node/assignment.py | 28 ++++++++++++++++++++++++++++ smnp/newast/node/identifier.py | 18 ++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 smnp/newast/node/assignment.py diff --git a/smnp/newast/node/assignment.py b/smnp/newast/node/assignment.py new file mode 100644 index 0000000..9c1804f --- /dev/null +++ b/smnp/newast/node/assignment.py @@ -0,0 +1,28 @@ +from smnp.newast.node.expression import ExpressionNode +from smnp.newast.node.none import NoneNode + + +class AssignmentNode(ExpressionNode): + def __init__(self, pos): + super().__init__(pos) + self.children.append(NoneNode()) + + @property + def target(self): + return self[0] + + @target.setter + def target(self, value): + self[0] = value + + @property + def value(self): + return self[1] + + @value.setter + def value(self, value): + self[1] = value + + @classmethod + def _parse(cls, input): + raise RuntimeError("This class is not supposed to be automatically called") \ No newline at end of file diff --git a/smnp/newast/node/identifier.py b/smnp/newast/node/identifier.py index 17d7a4a..9b8bba2 100644 --- a/smnp/newast/node/identifier.py +++ b/smnp/newast/node/identifier.py @@ -1,5 +1,7 @@ from smnp.newast.node.access import AccessNode from smnp.newast.node.args import ArgumentsListNode +from smnp.newast.node.assignment import AssignmentNode +from smnp.newast.node.expression import ExpressionNode from smnp.newast.node.invocation import FunctionCall from smnp.newast.parser import Parser from smnp.token.type import TokenType @@ -14,9 +16,25 @@ class IdentifierNode(AccessNode): def _literalParser(cls): return Parser.oneOf( IdentifierNode._functionCallParser(), + IdentifierNode._assignmentParser(), IdentifierNode._identifierParser() ) + @staticmethod + def _assignmentParser(): + def createNode(target, assignment, value): + node = AssignmentNode(assignment.pos) + node.target = target + node.value = value + return node + + return Parser.allOf( + IdentifierNode._identifierParser(), + Parser.terminalParser(TokenType.ASSIGN), + ExpressionNode.parse, + createNode=createNode + ) + @staticmethod def _functionCallParser(): def createNode(name, arguments):