diff --git a/smnp/ast/node/function.py b/smnp/ast/node/function.py index 9b506ae..c0fcfa3 100644 --- a/smnp/ast/node/function.py +++ b/smnp/ast/node/function.py @@ -1,10 +1,8 @@ -from smnp.ast.node.block import Block +from smnp.ast.node.block import BlockParser 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 @@ -124,23 +122,8 @@ def FunctionDefinitionParser(input): Parser.terminal(TokenType.FUNCTION), Parser.doAssert(IdentifierLiteralParser, "function/method name"), Parser.doAssert(ArgumentsDeclarationParser, "function/method arguments"), - Parser.doAssert(MethodBodyParser, "function/method body"), + Parser.doAssert(BlockParser, "function/method body"), createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body), name="function definition" )(input) - -def MethodBodyParser(input): - bodyItem = Parser.oneOf( - ReturnParser, - StatementParser, - name="function body item" - ) - - return Parser.loop( - Parser.terminal(TokenType.OPEN_CURLY), - Parser.doAssert(bodyItem, f"statement or '{TokenType.CLOSE_CURLY.key}'"), - 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/statement.py b/smnp/ast/node/statement.py index 608236f..f3b78ba 100644 --- a/smnp/ast/node/statement.py +++ b/smnp/ast/node/statement.py @@ -11,9 +11,11 @@ def StatementParser(input): from smnp.ast.node.condition import IfElseStatementParser from smnp.ast.node.expression import ExpressionParser + from smnp.ast.node.ret import ReturnParser return Parser.oneOf( IfElseStatementParser, ExpressionParser, BlockParser, + ReturnParser, name="statement" )(input) diff --git a/smnp/runtime/evaluator.py b/smnp/runtime/evaluator.py index afc6479..a3ca29e 100644 --- a/smnp/runtime/evaluator.py +++ b/smnp/runtime/evaluator.py @@ -3,6 +3,7 @@ from smnp.ast.node.condition import IfElse from smnp.ast.node.function import FunctionDefinition from smnp.ast.node.imports import Import from smnp.ast.node.program import Program +from smnp.ast.node.ret import Return from smnp.error.runtime import RuntimeException from smnp.type.model import Type @@ -73,12 +74,14 @@ def evaluate(node, environment): from smnp.runtime.evaluators.block import BlockEvaluator from smnp.runtime.evaluators.imports import ImportEvaluator from smnp.runtime.evaluators.function import FunctionDefinitionEvaluator + from smnp.runtime.evaluators.function import ReturnEvaluator result = Evaluator.oneOf( Evaluator.forNodes(ProgramEvaluator.evaluate, Program), Evaluator.forNodes(IfElseStatementEvaluator.evaluate, IfElse), Evaluator.forNodes(BlockEvaluator.evaluate, Block), Evaluator.forNodes(ImportEvaluator.evaluate, Import), Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinition), + Evaluator.forNodes(ReturnEvaluator.evaluate, Return), #Evaluator.forNodes(ImportEvaluator.evaluate, ImportNode), #Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinitionNode), #Evaluator.forNodes(ExtendEvaluator.evaluate, ExtendNode),