summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-08 02:16:05 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-08 02:16:05 +0330
commit1460877dca47ab740eef3a5529cd30008e1a27a5 (patch)
treed02752f617157d0cfd3d037bd69280e0acd094b3
parent1b8c8fb55ae5a2bc48951b65b01eb83d75ab4715 (diff)
add const check
fix some bugs
-rw-r--r--src/compiler/ast-tree.c8
-rw-r--r--src/compiler/parser.c2
-rw-r--r--src/runner/runner.c6
-rw-r--r--src/utils/log.h2
-rw-r--r--test/main.felan2
5 files changed, 11 insertions, 9 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 3ea860e..f5867cc 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -554,6 +554,7 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeVariables **variables,
case PARSER_TOKEN_OPERATOR_SUM:
return astTreeParseSum(parserNode, variables, variables_size);
case PARSER_TOKEN_VARIABLE:
+ return astTreeParseVariable(parserNode, variables, variables_size);
case PARSER_TOKEN_CONSTANT:
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
@@ -638,10 +639,6 @@ AstTree *astTreeParseFunction(ParserNode *parserNode,
if (!astTreeParseConstant(node, variables, variables_size)) {
goto RETURN_ERROR;
}
- } else if (node->token == PARSER_TOKEN_VARIABLE) {
- if (!astTreeParseConstant(node, variables, variables_size)) {
- goto RETURN_ERROR;
- }
} else {
AstTree *tree = astTreeParse(node, variables, variables_size);
@@ -1263,6 +1260,9 @@ bool setTypesOperatorAssign(AstTree *tree) {
} else if (!typeIsEqual(infix->left.type, infix->right.type)) {
printLog("Type mismatch");
return false;
+ } else if(isConst(&infix->left)){
+ printLog("Constants can't be assigned");
+ return false;
} else {
tree->type = copyAstTree(infix->left.type);
return true;
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index d5f61c5..d54b6de 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -837,7 +837,7 @@ ParserNode *parserVariable(LexerNode *node, LexerNode *begin, LexerNode *end,
if (node1 < end && node1->token == LEXER_TOKEN_SYMBOL_COLON) {
node1->parserNode = variableNode;
token = PARSER_TOKEN_CONSTANT;
- } else if (node1 < end && node1->token == LEXER_TOKEN_SYMBOL_COLON) {
+ } else if (node1 < end && node1->token == LEXER_TOKEN_SYMBOL_ASSIGN) {
node1->parserNode = variableNode;
} else {
node1 = NULL;
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 902dd93..23cbca0 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -63,6 +63,11 @@ AstTree *runAstTreeFunction(AstTreeFunction *function) {
}
}
continue;
+ case AST_TREE_TOKEN_VARIABLE_DEFINE: {
+ AstTreeVariable *variable = expr.metadata;
+ variable->value = calcAstTreeValue(variable->value);
+ }
+ continue;
case AST_TREE_TOKEN_OPERATOR_SUM:
case AST_TREE_TOKEN_FUNCTION:
case AST_TREE_TOKEN_TYPE_TYPE:
@@ -70,7 +75,6 @@ AstTree *runAstTreeFunction(AstTreeFunction *function) {
case AST_TREE_TOKEN_TYPE_VOID:
case AST_TREE_TOKEN_TYPE_U64:
case AST_TREE_TOKEN_VARIABLE:
- case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_VALUE_U64:
case AST_TREE_TOKEN_NONE:
}
diff --git a/src/utils/log.h b/src/utils/log.h
index 6e6bea9..620b2a3 100644
--- a/src/utils/log.h
+++ b/src/utils/log.h
@@ -1,7 +1,5 @@
#pragma once
-#include <stdlib.h>
-
#define printLog(format,...) _printLogBack(format, __FILE_NAME__, __LINE__, ## __VA_ARGS__)
#define UNREACHABLE printLog("Unreachable");exit(1)
diff --git a/test/main.felan b/test/main.felan
index a3aea7a..3afe119 100644
--- a/test/main.felan
+++ b/test/main.felan
@@ -1,5 +1,5 @@
main :: () -> void {
- a := fun();
+ a : u64 = fun();
a = a + 3;
print_u64 a + 5;
};