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.error.syntax import SyntaxException
from smnp.newast.node.expression import ExpressionNode from smnp.newast.node.expression import ExpressionNode
from smnp.newast.node.model import Node, ParseResult from smnp.newast.node.model import Node, ParseResult
from smnp.newast.node.statement import StatementNode
from smnp.newast.parser import Parser from smnp.newast.parser import Parser
@@ -13,6 +14,7 @@ class Program(Node):
def parseToken(input): def parseToken(input):
return Parser.oneOf( return Parser.oneOf(
ExpressionNode.parse, ExpressionNode.parse,
StatementNode.parse,
exception = SyntaxException("Unknown statement") exception = SyntaxException("Unknown statement")
)(input) )(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 return parse
@staticmethod @staticmethod
def epsilon(): def loop(startParser, itemParser, endParser, createNode):
def parser(input): def parse(input):
return ParseResult.OK(IgnoredNode((-1, -1))) 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