Fix return statement

This commit is contained in:
Bartłomiej Pluta
2019-07-12 22:25:26 +02:00
parent 5512f808f8
commit 41f385de09
3 changed files with 7 additions and 19 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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),