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.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
@@ -124,23 +122,8 @@ def FunctionDefinitionParser(input):
Parser.terminal(TokenType.FUNCTION), Parser.terminal(TokenType.FUNCTION),
Parser.doAssert(IdentifierLiteralParser, "function/method name"), Parser.doAssert(IdentifierLiteralParser, "function/method name"),
Parser.doAssert(ArgumentsDeclarationParser, "function/method arguments"), 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), createNode=lambda _, name, args, body: FunctionDefinition.withValues(name, args, body),
name="function definition" name="function definition"
)(input) )(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.condition import IfElseStatementParser
from smnp.ast.node.expression import ExpressionParser from smnp.ast.node.expression import ExpressionParser
from smnp.ast.node.ret import ReturnParser
return Parser.oneOf( return Parser.oneOf(
IfElseStatementParser, IfElseStatementParser,
ExpressionParser, ExpressionParser,
BlockParser, BlockParser,
ReturnParser,
name="statement" name="statement"
)(input) )(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.function import FunctionDefinition
from smnp.ast.node.imports import Import from smnp.ast.node.imports import Import
from smnp.ast.node.program import Program from smnp.ast.node.program import Program
from smnp.ast.node.ret import Return
from smnp.error.runtime import RuntimeException from smnp.error.runtime import RuntimeException
from smnp.type.model import Type 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.block import BlockEvaluator
from smnp.runtime.evaluators.imports import ImportEvaluator from smnp.runtime.evaluators.imports import ImportEvaluator
from smnp.runtime.evaluators.function import FunctionDefinitionEvaluator from smnp.runtime.evaluators.function import FunctionDefinitionEvaluator
from smnp.runtime.evaluators.function import ReturnEvaluator
result = Evaluator.oneOf( result = Evaluator.oneOf(
Evaluator.forNodes(ProgramEvaluator.evaluate, Program), Evaluator.forNodes(ProgramEvaluator.evaluate, Program),
Evaluator.forNodes(IfElseStatementEvaluator.evaluate, IfElse), Evaluator.forNodes(IfElseStatementEvaluator.evaluate, IfElse),
Evaluator.forNodes(BlockEvaluator.evaluate, Block), Evaluator.forNodes(BlockEvaluator.evaluate, Block),
Evaluator.forNodes(ImportEvaluator.evaluate, Import), Evaluator.forNodes(ImportEvaluator.evaluate, Import),
Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinition), Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinition),
Evaluator.forNodes(ReturnEvaluator.evaluate, Return),
#Evaluator.forNodes(ImportEvaluator.evaluate, ImportNode), #Evaluator.forNodes(ImportEvaluator.evaluate, ImportNode),
#Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinitionNode), #Evaluator.forNodes(FunctionDefinitionEvaluator.evaluate, FunctionDefinitionNode),
#Evaluator.forNodes(ExtendEvaluator.evaluate, ExtendNode), #Evaluator.forNodes(ExtendEvaluator.evaluate, ExtendNode),