Create BlockNode
This commit is contained in:
20
smnp/newast/node/block.py
Normal file
20
smnp/newast/node/block.py
Normal 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)
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
15
smnp/newast/node/statement.py
Normal file
15
smnp/newast/node/statement.py
Normal 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)
|
||||||
@@ -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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user