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.identifier import IdentifierLiteralParser
from smnp.ast.node.iterable import abstractIterableParser from smnp.ast.node.iterable import abstractIterableParser
from smnp.ast.node.model import Node from smnp.ast.node.model import Node
from smnp.ast.node.none import NoneNode 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.node.type import TypeParser, Type
from smnp.ast.parser import Parser from smnp.ast.parser import Parser
from smnp.token.type import TokenType from smnp.token.type import TokenType
@@ -122,7 +124,22 @@ def FunctionDefinitionParser(input):
Parser.terminal(TokenType.FUNCTION), Parser.terminal(TokenType.FUNCTION),
IdentifierLiteralParser, IdentifierLiteralParser,
ArgumentsDeclarationParser, ArgumentsDeclarationParser,
BlockParser, MethodBodyParser,
createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body), createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body),
name="function definition" name="function definition"
)(input) )(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.expression import ExpressionParser
# from smnp.ast.node.none import NoneNode from smnp.ast.node.valuable import Valuable
# from smnp.ast.node.statement import StatementNode from smnp.ast.parser import Parser
# from smnp.ast.parser import Parser from smnp.token.type import TokenType
# from smnp.token.type import TokenType
#
# class Return(Valuable):
# class ReturnNode(StatementNode): pass
# def __init__(self, pos):
# super().__init__(pos)
# self.children.append(NoneNode()) def ReturnParser(input):
# return Parser.allOf(
# @property Parser.terminal(TokenType.RETURN),
# def value(self): Parser.optional(ExpressionParser),
# return self[0] createNode=lambda ret, val: Return.withValue(val, ret.pos),
# name="return"
# @value.setter )(input)
# 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)

View File

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