Enable support for asterisk

This commit is contained in:
Bartłomiej Pluta
2019-07-05 22:58:26 +02:00
parent b15bb8e846
commit f7b8704516
2 changed files with 54 additions and 2 deletions

View File

@@ -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")

View File

@@ -1,6 +1,9 @@
from smnp.newast.node.asterisk import AsteriskNode
from smnp.newast.node.model import Node from smnp.newast.node.model import Node
from smnp.newast.node.none import NoneNode from smnp.newast.node.none import NoneNode
from smnp.newast.node.statement import StatementNode
from smnp.newast.parser import Parser from smnp.newast.parser import Parser
from smnp.token.type import TokenType
class ExpressionNode(Node): class ExpressionNode(Node):
@@ -23,9 +26,30 @@ class ExpressionNode(Node):
node.value = val node.value = val
return node return node
@classmethod @classmethod
def _parse(cls, input): 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.integer import IntegerLiteralNode
from smnp.newast.node.string import StringLiteralNode from smnp.newast.node.string import StringLiteralNode
from smnp.newast.node.note import NoteLiteralNode from smnp.newast.node.note import NoteLiteralNode
@@ -38,4 +62,4 @@ class ExpressionNode(Node):
NoteLiteralNode.parse, NoteLiteralNode.parse,
IdentifierNode.parse, IdentifierNode.parse,
ListNode.parse ListNode.parse
)(input) )