diff options
-rw-r--r-- | src/compiler/ast-tree.c | 20 | ||||
-rw-r--r-- | src/compiler/parser.c | 60 | ||||
-rw-r--r-- | src/runner/runner.c | 1 | ||||
-rw-r--r-- | test/main.felan | 16 |
4 files changed, 50 insertions, 47 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 6f96f49..7c520aa 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -2048,6 +2048,13 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) { if (type0_metadata->arguments_size != type1_metadata->arguments_size) { return false; } + for (size_t i = 0; i < type0_metadata->arguments_size; ++i) { + AstTree *p0 = type0_metadata->arguments[i]; + AstTree *p1 = type1_metadata->arguments[i]; + if (!typeIsEqual(p0, p1)) { + return false; + } + } return true; case AST_TREE_TOKEN_FUNCTION_CALL: printError(type0->str_begin, type0->str_end, "Not implemented yet"); @@ -2713,8 +2720,8 @@ bool setTypesIf(AstTree *tree, AstTreeSetTypesHelper helper, } if (metadata->elseBody != NULL && - typeIsEqual(metadata->ifBody, metadata->elseBody)) { - tree->type = copyAstTree(metadata->ifBody); + typeIsEqual(metadata->ifBody->type, metadata->elseBody->type)) { + tree->type = copyAstTree(metadata->ifBody->type); } else { tree->type = &AST_TREE_VOID_TYPE; } @@ -2745,8 +2752,6 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper, AstTreeFunction *function) { AstTreeScope *metadata = tree->metadata; - tree->type = &AST_TREE_VOID_TYPE; - for (size_t i = 0; i < metadata->expressions_size; ++i) { if (!setAllTypes(metadata->expressions[i], helper, function)) { return false; @@ -2759,6 +2764,13 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper, } } + if (metadata->expressions_size == 0) { + tree->type = &AST_TREE_VOID_VALUE; + } else { + tree->type = copyAstTree( + metadata->expressions[metadata->expressions_size - 1]->type); + } + return true; } diff --git a/src/compiler/parser.c b/src/compiler/parser.c index a47869d..2476e32 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -318,11 +318,11 @@ void parserNodePrint(const ParserNode *node, int indent) { } goto RETURN_SUCCESS; case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_SUM: case PARSER_TOKEN_OPERATOR_SUB: case PARSER_TOKEN_OPERATOR_MULTIPLY: @@ -494,11 +494,11 @@ void parserNodeDelete(ParserNode *node) { } goto RETURN_SUCCESS; case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_SUM: case PARSER_TOKEN_OPERATOR_SUB: case PARSER_TOKEN_OPERATOR_MULTIPLY: @@ -1154,11 +1154,11 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_SYMBOL_PARENTHESIS: case PARSER_TOKEN_SYMBOL_COMMA: case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1490,11 +1490,11 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_KEYWORD_PRINT_U64: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1576,11 +1576,11 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_KEYWORD_PRINT_U64: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1610,11 +1610,11 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_VALUE_BOOL: case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_OPERATOR_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: -case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: -case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: -case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: -case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUM_ASSIGN: + case PARSER_TOKEN_OPERATOR_SUB_ASSIGN: + case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: + case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: + case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: diff --git a/src/runner/runner.c b/src/runner/runner.c index 81154f5..b5f0cb3 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -164,6 +164,7 @@ void runnerVariableSetValue(RunnerVariablePages *pages, } } + printError(variable->name_begin,variable->name_end,"Variable not found"); UNREACHABLE; } diff --git a/test/main.felan b/test/main.felan index ca2694c..7d80a9c 100644 --- a/test/main.felan +++ b/test/main.felan @@ -1,16 +1,6 @@ main :: () -> void { - a :getType(i64,u64)= 0; - while a < 10 { - print_u64 a; - a += 1; - } + a :u64= 2; + a += (if a == 2 1 else 2); + print_u64 a; }; -signed :: false; - -getType :: (a:type,b:type)->type { - if signed - return a; - else - return b; -}; |