diff --git a/smnp/newast/node/asterisk.py b/smnp/newast/node/asterisk.py new file mode 100644 index 0000000..fc3c612 --- /dev/null +++ b/smnp/newast/node/asterisk.py @@ -0,0 +1,28 @@ +from smnp.newast.node.none import NoneNode +from smnp.newast.node.statement import StatementNode + + +class AsteriskNode(StatementNode): + def __init__(self, pos): + super().__init__(pos) + self.children = [NoneNode(), NoneNode()] + + @property + def iterator(self): + return self[0] + + @iterator.setter + def iterator(self, value): + self[0] = value + + @property + def statement(self): + return self[1] + + @statement.setter + def statement(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/expression.py b/smnp/newast/node/expression.py index 68b46f1..b6be2e1 100644 --- a/smnp/newast/node/expression.py +++ b/smnp/newast/node/expression.py @@ -1,6 +1,9 @@ +from smnp.newast.node.asterisk import AsteriskNode from smnp.newast.node.model import Node from smnp.newast.node.none import NoneNode +from smnp.newast.node.statement import StatementNode from smnp.newast.parser import Parser +from smnp.token.type import TokenType class ExpressionNode(Node): @@ -23,9 +26,30 @@ class ExpressionNode(Node): node.value = val return node - @classmethod def _parse(cls, input): + return Parser.oneOf( + cls._asteriskParser(), + cls._expressionParser(), + )(input) + + @classmethod + def _asteriskParser(cls): + def createNode(iterator, asterisk, statement): + node = AsteriskNode(asterisk.pos) + node.iterator = iterator + node.statement = statement + return node + + return Parser.allOf( + cls._expressionParser(), + Parser.terminalParser(TokenType.ASTERISK), + StatementNode.parse, + createNode=createNode + ) + + @classmethod + def _expressionParser(cls): from smnp.newast.node.integer import IntegerLiteralNode from smnp.newast.node.string import StringLiteralNode from smnp.newast.node.note import NoteLiteralNode @@ -38,4 +62,4 @@ class ExpressionNode(Node): NoteLiteralNode.parse, IdentifierNode.parse, ListNode.parse - )(input) \ No newline at end of file + ) \ No newline at end of file