Create statements and block nodes
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user