summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-21 01:44:38 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-21 01:44:38 +0330
commit13156d99a29ba927f64d344cf4d385414bcf61e1 (patch)
treed20a5e2e18b471f4ee24b5766c04aa9509aa6fff
parentdf4604f27bbd8ed42ea2c7026c7e4845aafd1a8b (diff)
add type def as variable
fix some memory leaks
-rw-r--r--src/compiler/ast-tree.c77
-rw-r--r--src/compiler/ast-tree.h1
-rw-r--r--src/compiler/parser.c4
-rw-r--r--test/main.felan8
4 files changed, 80 insertions, 10 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 3d7c675..4d6c3ee 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -528,6 +528,7 @@ void astTreeDestroy(AstTree tree) {
case AST_TREE_TOKEN_NONE:
}
+ printLog("token = %d", tree.token);
UNREACHABLE;
}
@@ -829,8 +830,6 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
case PARSER_TOKEN_KEYWORD_IF:
case PARSER_TOKEN_KEYWORD_WHILE:
- goto AFTER_SWITCH;
- case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_TYPE_TYPE:
case PARSER_TOKEN_TYPE_FUNCTION:
case PARSER_TOKEN_TYPE_VOID:
@@ -843,6 +842,8 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_TYPE_I64:
case PARSER_TOKEN_TYPE_U64:
case PARSER_TOKEN_TYPE_BOOL:
+ goto AFTER_SWITCH;
+ case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_KEYWORD_PRINT_U64:
case PARSER_TOKEN_KEYWORD_RETURN:
case PARSER_TOKEN_CONSTANT:
@@ -850,7 +851,8 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA:
- printError(node->str_begin, node->str_end, "Should not be here");
+ printError(node->str_begin, node->str_end, "Should not be here %s",
+ PARSER_TOKEN_STRINGS[node->token]);
goto RETURN_ERROR;
case PARSER_TOKEN_NONE:
}
@@ -884,7 +886,9 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
goto RETURN_ERROR;
}
- free(helper.globalDeps->data);
+ for (size_t i = 0; i < variables->size; ++i) {
+ free(helper.globalDeps[i].data);
+ }
free(helper.globalDeps);
return root;
@@ -1943,6 +1947,63 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
UNREACHABLE;
}
+AstTree *getValue(AstTree *tree) {
+ switch (tree->token) {
+ case AST_TREE_TOKEN_TYPE_FUNCTION:
+ return copyAstTree(tree);
+ case AST_TREE_TOKEN_TYPE_TYPE:
+ case AST_TREE_TOKEN_TYPE_VOID:
+ case AST_TREE_TOKEN_TYPE_I8:
+ case AST_TREE_TOKEN_TYPE_U8:
+ case AST_TREE_TOKEN_TYPE_I16:
+ case AST_TREE_TOKEN_TYPE_U16:
+ case AST_TREE_TOKEN_TYPE_I32:
+ case AST_TREE_TOKEN_TYPE_U32:
+ case AST_TREE_TOKEN_TYPE_I64:
+ case AST_TREE_TOKEN_TYPE_U64:
+ case AST_TREE_TOKEN_TYPE_F16:
+ case AST_TREE_TOKEN_TYPE_F32:
+ case AST_TREE_TOKEN_TYPE_F64:
+ case AST_TREE_TOKEN_TYPE_F128:
+ case AST_TREE_TOKEN_TYPE_BOOL:
+ return tree;
+ case AST_TREE_TOKEN_VARIABLE: {
+ AstTreeVariable *metadata = tree->metadata;
+ if (metadata->isConst) {
+ return getValue(metadata->value);
+ }
+ }
+ case AST_TREE_TOKEN_FUNCTION:
+ case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
+ case AST_TREE_TOKEN_KEYWORD_RETURN:
+ case AST_TREE_TOKEN_KEYWORD_IF:
+ case AST_TREE_TOKEN_KEYWORD_WHILE:
+ case AST_TREE_TOKEN_FUNCTION_CALL:
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
+ case AST_TREE_TOKEN_VALUE_VOID:
+ case AST_TREE_TOKEN_VALUE_INT:
+ case AST_TREE_TOKEN_VALUE_FLOAT:
+ case AST_TREE_TOKEN_VALUE_BOOL:
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
+ case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
+ case AST_TREE_TOKEN_OPERATOR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_GREATER:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER:
+ case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+ case AST_TREE_TOKEN_SCOPE:
+ case AST_TREE_TOKEN_NONE:
+ }
+ UNREACHABLE;
+}
+
bool isCircularDependencies(AstTreeHelper *helper, AstTreeVariable *variable,
AstTree *tree) {
switch (tree->token) {
@@ -2229,7 +2290,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeFloat value = *(AstTreeFloat *)tree->metadata;
f32 newValue = value;
*(AstTreeFloat *)tree->metadata = value;
- if (value != newValue) {
+ if (value - newValue != 0) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F32_TYPE;
@@ -2452,6 +2513,12 @@ bool setTypesAstVariable(AstTreeVariable *variable,
return false;
}
+ if (variable->type != NULL) {
+ AstTree *type = variable->type;
+ variable->type = getValue(type);
+ astTreeDelete(type);
+ }
+
helper.lookingType = variable->type;
if (variable->value != NULL && !setAllTypes(variable->value, helper, NULL)) {
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index b58d413..c8f5f75 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -213,6 +213,7 @@ AstTreeFunction *getFunction(AstTree *value);
bool isConst(AstTree *value);
AstTree *makeTypeOf(AstTree *value);
bool typeIsEqual(const AstTree *type0, const AstTree *type1);
+AstTree *getValue(AstTree *tree);
bool isCircularDependencies(AstTreeHelper *helper, AstTreeVariable *variable,
AstTree *tree);
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 9f6b060..c5721f1 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -1513,8 +1513,8 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_TYPE_F64:
case PARSER_TOKEN_TYPE_F128:
case PARSER_TOKEN_TYPE_BOOL:
- return true;
case PARSER_TOKEN_IDENTIFIER:
+ return true;
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_VARIABLE:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
@@ -1573,6 +1573,7 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_OPERATOR_SMALLER:
case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+ case PARSER_TOKEN_TYPE_FUNCTION:
case PARSER_TOKEN_TYPE_TYPE:
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_TYPE_BOOL:
@@ -1590,7 +1591,6 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_TYPE_F128:
case PARSER_TOKEN_KEYWORD_IF:
return true;
- case PARSER_TOKEN_TYPE_FUNCTION:
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_VARIABLE:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
diff --git a/test/main.felan b/test/main.felan
index b99a284..387bd90 100644
--- a/test/main.felan
+++ b/test/main.felan
@@ -1,7 +1,9 @@
-main :: () -> void {
- a := 10000;
+test :: ()->void;
+
+main : test : () -> void {
+ a := 10;
while a > 0 {
- print_u64 2;
+ print_u64 1;
a = a -1;
}
};