From e71bffcf5d1cd6368c32d3ff11f03888fc3c7711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Fri, 12 Jul 2019 00:35:41 +0200 Subject: [PATCH] Create 'return' statement --- smnp/ast/node/function.py | 21 +++++++++++++++-- smnp/ast/node/ret.py | 49 ++++++++++++++------------------------- smnp/ast/node/valuable.py | 4 ++-- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/smnp/ast/node/function.py b/smnp/ast/node/function.py index 046f637..82981cf 100644 --- a/smnp/ast/node/function.py +++ b/smnp/ast/node/function.py @@ -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) diff --git a/smnp/ast/node/ret.py b/smnp/ast/node/ret.py index 6697abb..cd3b80f 100644 --- a/smnp/ast/node/ret.py +++ b/smnp/ast/node/ret.py @@ -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) \ No newline at end of file +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) \ No newline at end of file diff --git a/smnp/ast/node/valuable.py b/smnp/ast/node/valuable.py index c7bb0a7..8e9466e 100644 --- a/smnp/ast/node/valuable.py +++ b/smnp/ast/node/valuable.py @@ -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 \ No newline at end of file