Create BlockNode

This commit is contained in:
Bartłomiej Pluta
2019-07-05 22:06:07 +02:00
parent 6d59ffff1c
commit ec3675ac43
4 changed files with 54 additions and 4 deletions

20
smnp/newast/node/block.py Normal file
View File

@@ -0,0 +1,20 @@
from smnp.newast.node.statement import StatementNode
from smnp.newast.parser import Parser
from smnp.token.type import TokenType
class BlockNode(StatementNode):
@classmethod
def _parse(cls, input):
def createNode(start, items, end):
node = StatementNode(start.pos)
node.children = items
return node
return Parser.loop(
Parser.terminalParser(TokenType.OPEN_BRACKET),
StatementNode.parse,
Parser.terminalParser(TokenType.CLOSE_BRACKET),
createNode=createNode
)(input)

View File

@@ -1,6 +1,7 @@
from smnp.error.syntax import SyntaxException
from smnp.newast.node.expression import ExpressionNode
from smnp.newast.node.model import Node, ParseResult
from smnp.newast.node.statement import StatementNode
from smnp.newast.parser import Parser
@@ -13,6 +14,7 @@ class Program(Node):
def parseToken(input):
return Parser.oneOf(
ExpressionNode.parse,
StatementNode.parse,
exception = SyntaxException("Unknown statement")
)(input)

View File

@@ -0,0 +1,15 @@
from smnp.newast.node.model import Node
from smnp.newast.parser import Parser
class StatementNode(Node):
@classmethod
def _parse(cls, input):
from smnp.newast.node.block import BlockNode
from smnp.newast.node.expression import ExpressionNode
return Parser.oneOf(
BlockNode.parse,
ExpressionNode.parse
)(input)

View File

@@ -97,8 +97,21 @@ class Parser:
return parse
@staticmethod
def epsilon():
def parser(input):
return ParseResult.OK(IgnoredNode((-1, -1)))
def loop(startParser, itemParser, endParser, createNode):
def parse(input):
items = []
start = startParser(input)
if start.result:
while True:
end = endParser(input)
if end.result:
return ParseResult.OK(createNode(start.node, items, end.node))
item = itemParser(input)
if not item.result:
return ParseResult.FAIL()
items.append(item.node)
return ParseResult.FAIL()
return parse
return parser