Create statements and block nodes

This commit is contained in:
Bartłomiej Pluta
2019-07-11 00:18:40 +02:00
parent 5a25ec6ffe
commit 101ce862b0
4 changed files with 43 additions and 31 deletions

View File

@@ -1,20 +1,19 @@
from smnp.ast.node.statement import StatementNode
from smnp.ast.node.model import Node
from smnp.ast.node.statement import StatementParser
from smnp.ast.parser import Parser
from smnp.token.type import TokenType
class BlockNode(StatementNode):
class Block(Node):
pass
@classmethod
def _parse(cls, input):
def createNode(start, items, end):
node = BlockNode(start.pos)
node.children = items
return node
return Parser.loop(
Parser.terminalParser(TokenType.OPEN_CURLY),
Parser.doAssert(StatementNode.parse, f"statement or '{TokenType.CLOSE_CURLY.key}'"),
Parser.terminalParser(TokenType.CLOSE_CURLY),
createNode=createNode,
)(input)
def BlockParser(input):
parser = Parser.loop(
Parser.terminalParser(TokenType.OPEN_CURLY),
Parser.doAssert(StatementParser, f"statement or '{TokenType.CLOSE_CURLY.key}'"),
Parser.terminalParser(TokenType.CLOSE_CURLY),
createNode=lambda open, statements, close: Block.withChildren(statements, open.pos)
)
return Parser(parser, "block", [parser])(input)

View File

@@ -15,6 +15,7 @@ class Loop(BinaryOperator):
def FactorParser(input):
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.statement import StatementParser
powerFactor = Parser.leftAssociativeOperatorParser(
ChainParser,
@@ -33,7 +34,7 @@ def FactorParser(input):
loopFactor = Parser.allOf(
powerFactor,
Parser.terminalParser(TokenType.DASH, createNode=Operator.withValue),
MaxPrecedenceExpressionParser, #TODO statement here
StatementParser,
createNode=Loop.withValues
)

View File

@@ -1,5 +1,5 @@
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.model import Node, ParseResult
from smnp.ast.node.statement import StatementParser
from smnp.ast.parser import Parser
@@ -12,10 +12,7 @@ def parse(input):
while input.hasCurrent():
result = Parser.oneOf(
# Start Symbol
#TODO -> temporary (to remove):
MaxPrecedenceExpressionParser,
StatementParser,
exception=RuntimeError("Nie znam tego wyrazenia")
)(input)

View File

@@ -1,17 +1,32 @@
from smnp.ast.node.expression import MaxPrecedenceExpressionParser
from smnp.ast.node.model import Node
from smnp.ast.parser import Parser
class StatementNode(Node):
class Statement(Node):
pass
@classmethod
def _parse(cls, input):
from smnp.ast.node.block import BlockNode
from smnp.ast.node.expression import ExpressionNode
from smnp.ast.node.ret import ReturnNode
return Parser.oneOf(
ExpressionNode.parse,
BlockNode.parse,
ReturnNode.parse,
)(input)
def StatementParser(input):
from smnp.ast.node.block import BlockParser
parser = Parser.oneOf(
BlockParser,
MaxPrecedenceExpressionParser
)
return Parser(parser, "statement", parser)(input)
# class StatementNode(Node):
#
# @classmethod
# def _parse(cls, input):
# from smnp.ast.node.block import BlockNode
# from smnp.ast.node.expression import ExpressionNode
# from smnp.ast.node.ret import ReturnNode
#
# return Parser.oneOf(
# ExpressionNode.parse,
# BlockNode.parse,
# ReturnNode.parse,
# )(input)