diff options
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | code/main.felan | 10 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 52 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 3 |
4 files changed, 47 insertions, 26 deletions
@@ -19,9 +19,9 @@ NC := \033[0m INC_DIRS := $(SRC_DIR) INC_FLAGS := $(addprefix -I,$(INC_DIRS)) -# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3 +CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -O3 # CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -Oz -CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g +# CFLAGS := $(INC_FLAGS) -Wall -Wextra -std=gnu23 -g EXEC_FILE := $(BUILD_DIR)/$(PROJECT_NAME) @@ -66,10 +66,10 @@ test-all: $(EXEC_FILE) test/big.felan test/big.felan: Makefile mkdir -p test echo "main :: () -> void {" > $@ - for((n = 0;n < 100000;n++)); do echo " print(1);" >> $@; done + for((n = 0;n < 100000;n++)); do echo " print('1');" >> $@; done echo "};" >> $@ echo "print :: (value:u8) -> void {" >> $@ - echo " putc '0'+value;" >> $@ + echo " putc value;" >> $@ echo "};" >> $@ # $@ = left hand of : diff --git a/code/main.felan b/code/main.felan index 47de67d..583c05d 100644 --- a/code/main.felan +++ b/code/main.felan @@ -17,9 +17,19 @@ long_double :: f128; usize :: u64; +t :: f(7); + +f :: (a:i64)->i64{ + if a == 0 || a == 1 + return 0; + else + return f(a-1)+f(a-2); +}; + main :: () -> void { a :i64 = 12; b :u64 = 34; + print_rev(t); print_rev(a); print_rev(b); print_rev(); diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index cb1fa03..4956ec0 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -1361,7 +1361,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { } } - if (!setAllTypesRoot(root, &helper)) { + if (!setAllTypesRoot(root)) { goto RETURN_ERROR; } @@ -2998,10 +2998,9 @@ AstTree *getValue(AstTree *tree) { UNREACHABLE; } -bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper) { +bool setAllTypesRoot(AstTreeRoot *root) { AstTreeSetTypesHelper setTypesHelper = { .lookingType = NULL, - .treeHelper = helper, .dependencies = { .data = NULL, @@ -3331,14 +3330,31 @@ bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = makeTypeOf(tree); - for (size_t i = 0; i < metadata->scope.expressions_size; ++i) { - if (!setAllTypes(metadata->scope.expressions[i], helper, metadata, NULL)) { - return false; + AstTreeVariable *deps[helper.dependencies.size]; + size_t deps_size = 0; + for (size_t i = 0; i < helper.dependencies.size; ++i) { + AstTreeVariable *var = helper.dependencies.data[i]; + if (var->value == tree) { + continue; } + deps[deps_size] = helper.dependencies.data[i]; + deps_size += 1; } + AstTreeSetTypesHelper newHelper = { + .lookingType = NULL, + .dependencies.data = deps, + .dependencies.size = deps_size, + }; + for (size_t i = 0; i < metadata->scope.variables.size; ++i) { - if (!setTypesAstVariable(metadata->scope.variables.data[i], helper)) { + if (!setTypesAstVariable(metadata->scope.variables.data[i], newHelper)) { + return false; + } + } + + for (size_t i = 0; i < metadata->scope.expressions_size; ++i) { + if (!setAllTypes(metadata->scope.expressions[i], newHelper, metadata, NULL)) { return false; } } @@ -3350,7 +3366,6 @@ bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) { AstTreeSingleChild *metadata = tree->metadata; AstTreeSetTypesHelper helper = { .lookingType = &AST_TREE_U8_TYPE, - .treeHelper = _helper.treeHelper, .dependencies = _helper.dependencies, }; if (!setAllTypes(metadata, helper, NULL, NULL)) { @@ -3374,7 +3389,6 @@ bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper, if (metadata->value != NULL) { AstTreeSetTypesHelper helper = { .lookingType = getValue(function->returnType), - .treeHelper = _helper.treeHelper, .dependencies = _helper.dependencies, }; if (helper.lookingType == NULL) { @@ -3424,7 +3438,6 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) { AstTreeSetTypesHelper helper = { .lookingType = NULL, - .treeHelper = _helper.treeHelper, .dependencies = _helper.dependencies, }; @@ -3716,7 +3729,6 @@ bool setTypesOperatorInfixWithRetAndLooking(AstTree *tree, AstTree *lookingType, AstTreeSetTypesHelper _helper) { AstTreeSetTypesHelper helper = { .lookingType = lookingType, - .treeHelper = _helper.treeHelper, .dependencies = _helper.dependencies, }; AstTreeInfix *infix = tree->metadata; @@ -3746,7 +3758,6 @@ bool setTypesOperatorUnaryWithRetAndLooking(AstTree *tree, AstTree *lookingType, AstTreeSetTypesHelper _helper) { AstTreeSetTypesHelper helper = { .lookingType = lookingType, - .treeHelper = _helper.treeHelper, .dependencies = _helper.dependencies, }; AstTreeSingleChild *operand = tree->metadata; @@ -3828,7 +3839,6 @@ bool setTypesAstVariable(AstTreeVariable *variable, AstTreeSetTypesHelper helper = { .lookingType = &AST_TREE_TYPE_TYPE, - .treeHelper = _helper.treeHelper, .dependencies = { .data = deps, @@ -4118,15 +4128,17 @@ bool setTypesBuiltin(AstTree *tree, AstTreeSetTypesHelper helper, UNREACHABLE; } -bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) { +bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper _helper) { + AstTreeSetTypesHelper helper = { + .lookingType = NULL, + .dependencies = _helper.dependencies, + }; + if (!setAllTypes(&infix->left, helper, NULL, NULL)) { return false; } - AstTreeSetTypesHelper newHelper = { - .lookingType = infix->left.type, - .treeHelper = helper.treeHelper, - .dependencies = helper.dependencies, - }; - return setAllTypes(&infix->right, newHelper, NULL, NULL); + helper.lookingType = infix->left.type; + + return setAllTypes(&infix->right, helper, NULL, NULL); } diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 85bd44e..e03405e 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -214,7 +214,6 @@ typedef struct AstTreeHelper { typedef struct AstTreeSetTypesHelper { AstTree *lookingType; - AstTreeHelper *treeHelper; AstTreeVariables dependencies; } AstTreeSetTypesHelper; @@ -316,7 +315,7 @@ bool typeIsEqual(AstTree *type0, AstTree *type1); bool typeIsEqualBack(const AstTree *type0, const AstTree *type1); AstTree *getValue(AstTree *tree); -bool setAllTypesRoot(AstTreeRoot *root, AstTreeHelper *helper); +bool setAllTypesRoot(AstTreeRoot *root); bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, AstTreeFunction *function, AstTreeFunctionCall *functionCall); bool setTypesValueBool(AstTree *tree, AstTreeSetTypesHelper helper); |