summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/ast-tree.c20
-rw-r--r--src/compiler/parser.c60
2 files changed, 46 insertions, 34 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: