Create 'return' statement

This commit is contained in:
Bartłomiej Pluta
2019-07-12 00:35:41 +02:00
parent ee91dbec8a
commit e71bffcf5d
3 changed files with 38 additions and 36 deletions

View File

@@ -1,8 +1,10 @@
from smnp.ast.node.block import BlockParser
from smnp.ast.node.block import Block
from smnp.ast.node.identifier import IdentifierLiteralParser
from smnp.ast.node.iterable import abstractIterableParser
from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode
from smnp.ast.node.ret import ReturnParser
from smnp.ast.node.statement import StatementParser
from smnp.ast.node.type import TypeParser, Type
from smnp.ast.parser import Parser
from smnp.token.type import TokenType
@@ -122,7 +124,22 @@ def FunctionDefinitionParser(input):
Parser.terminal(TokenType.FUNCTION),
IdentifierLiteralParser,
ArgumentsDeclarationParser,
BlockParser,
MethodBodyParser,
createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body),
name="function definition"
)(input)
def MethodBodyParser(input):
bodyItem = Parser.oneOf(
StatementParser,
ReturnParser,
name="function body item"
)
return Parser.loop(
Parser.terminal(TokenType.OPEN_CURLY),
bodyItem,
Parser.terminal(TokenType.CLOSE_CURLY),
createNode=lambda open, statements, close: Block.withChildren(statements, open.pos),
name="function body"
)(input)

View File

@@ -1,32 +1,17 @@
# from smnp.ast.node.expression import ExpressionNode
# from smnp.ast.node.none import NoneNode
# from smnp.ast.node.statement import StatementNode
# from smnp.ast.parser import Parser
# from smnp.token.type import TokenType
#
#
# class ReturnNode(StatementNode):
# def __init__(self, pos):
# super().__init__(pos)
# self.children.append(NoneNode())
#
# @property
# def value(self):
# return self[0]
#
# @value.setter
# def value(self, value):
# self[0] = value
#
# @classmethod
# def _parse(cls, input):
# def createNode(ret, value):
# node = ReturnNode(ret.pos)
# node.value = value
# return node
#
# return Parser.allOf(
# Parser.terminalParser(TokenType.RETURN),
# Parser.doAssert(ExpressionNode.parse, "expression"),
# createNode=createNode
# )(input)
from smnp.ast.node.expression import ExpressionParser
from smnp.ast.node.valuable import Valuable
from smnp.ast.parser import Parser
from smnp.token.type import TokenType
class Return(Valuable):
pass
def ReturnParser(input):
return Parser.allOf(
Parser.terminal(TokenType.RETURN),
Parser.optional(ExpressionParser),
createNode=lambda ret, val: Return.withValue(val, ret.pos),
name="return"
)(input)

View File

@@ -16,7 +16,7 @@ class Valuable(Node):
self[0] = value
@classmethod
def withValue(cls, value):
node = cls(value.pos)
def withValue(cls, value, pos=None):
node = cls(value.pos if pos is None else pos)
node.value = value
return node