summaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-13 16:42:08 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-13 16:42:08 +0330
commitfe459ce514c3dd6352bbc88f9184cb79f35b9cb4 (patch)
treea3ff67584af541fa505bcfbd6aef75202931ca4c /src/compiler/ast-tree.c
parent441519c4cf0ba7b4d63a2cd761e5553ea925de32 (diff)
add == != > >= < <=
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c150
1 files changed, 137 insertions, 13 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 9f421ae..d50d0f6 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -19,20 +19,20 @@ AstTree AST_TREE_VOID_TYPE = {
.type = &AST_TREE_TYPE_TYPE,
};
-AstTree AST_TREE_I64_TYPE = {
- .token = AST_TREE_TOKEN_TYPE_I64,
+AstTree AST_TREE_BOOL_TYPE = {
+ .token = AST_TREE_TOKEN_TYPE_BOOL,
.metadata = NULL,
.type = &AST_TREE_TYPE_TYPE,
};
-AstTree AST_TREE_U64_TYPE = {
- .token = AST_TREE_TOKEN_TYPE_U64,
+AstTree AST_TREE_I64_TYPE = {
+ .token = AST_TREE_TOKEN_TYPE_I64,
.metadata = NULL,
.type = &AST_TREE_TYPE_TYPE,
};
-AstTree AST_TREE_BOOL_TYPE = {
- .token = AST_TREE_TOKEN_TYPE_BOOL,
+AstTree AST_TREE_U64_TYPE = {
+ .token = AST_TREE_TOKEN_TYPE_U64,
.metadata = NULL,
.type = &AST_TREE_TYPE_TYPE,
};
@@ -145,7 +145,7 @@ void astTreePrint(const AstTree *tree, int indent) {
}
goto RETURN_SUCCESS;
case AST_TREE_TOKEN_VALUE_INT: {
- AstTreeU64 metadata = (AstTreeU64)tree->metadata;
+ AstTreeInt metadata = (AstTreeInt)tree->metadata;
printf(",value=%lu", metadata);
}
goto RETURN_SUCCESS;
@@ -201,7 +201,14 @@ void astTreePrint(const AstTree *tree, int indent) {
case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
case AST_TREE_TOKEN_OPERATOR_DIVIDE:
case AST_TREE_TOKEN_OPERATOR_MODULO:
- case AST_TREE_TOKEN_OPERATOR_ASSIGN: {
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ 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: {
+
AstTreeInfix *metadata = tree->metadata;
printf(",\n");
for (int i = 0; i < indent; ++i)
@@ -276,7 +283,9 @@ void astTreeRootPrint(const AstTreeRoot *root) {
}
void astTreeDestroy(AstTree tree) {
- astTreeDelete(tree.type);
+ if (tree.type != NULL) {
+ astTreeDelete(tree.type);
+ }
switch (tree.token) {
case AST_TREE_TOKEN_FUNCTION: {
AstTreeFunction *metadata = tree.metadata;
@@ -350,7 +359,13 @@ void astTreeDestroy(AstTree tree) {
case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
case AST_TREE_TOKEN_OPERATOR_DIVIDE:
case AST_TREE_TOKEN_OPERATOR_MODULO:
- case AST_TREE_TOKEN_OPERATOR_ASSIGN: {
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ 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: {
AstTreeInfix *metadata = tree.metadata;
astTreeDestroy(metadata->left);
astTreeDestroy(metadata->right);
@@ -463,7 +478,13 @@ AstTree *copyAstTree(AstTree *tree) {
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_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: {
AstTreeInfix *metadata = tree->metadata;
AstTreeInfix *new_metadata = a404m_malloc(sizeof(*new_metadata));
AstTree *left = copyAstTree(&metadata->left);
@@ -651,6 +672,12 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_OPERATOR_MULTIPLY:
case PARSER_TOKEN_OPERATOR_DIVIDE:
case PARSER_TOKEN_OPERATOR_MODULO:
+ case PARSER_TOKEN_OPERATOR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_NOT_EQUAL:
+ case PARSER_TOKEN_OPERATOR_GREATER:
+ case PARSER_TOKEN_OPERATOR_SMALLER:
+ case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
case PARSER_TOKEN_KEYWORD_IF:
goto AFTER_SWITCH;
@@ -800,7 +827,7 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) {
case PARSER_TOKEN_VALUE_INT:
return newAstTree(
AST_TREE_TOKEN_VALUE_INT,
- (void *)(AstTreeU64)(ParserNodeU64Metadata)parserNode->metadata, NULL,
+ (void *)(AstTreeInt)(ParserNodeIntMetadata)parserNode->metadata, NULL,
parserNode->str_begin, parserNode->str_end);
case PARSER_TOKEN_VALUE_BOOL:
return newAstTree(
@@ -829,6 +856,24 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) {
case PARSER_TOKEN_OPERATOR_MODULO:
return astTreeParseBinaryOperator(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_MODULO);
+ case PARSER_TOKEN_OPERATOR_EQUAL:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_EQUAL);
+ case PARSER_TOKEN_OPERATOR_NOT_EQUAL:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_NOT_EQUAL);
+ case PARSER_TOKEN_OPERATOR_GREATER:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_GREATER);
+ case PARSER_TOKEN_OPERATOR_SMALLER:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_SMALLER);
+ case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL);
+ case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+ return astTreeParseBinaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL);
case PARSER_TOKEN_OPERATOR_PLUS:
return astTreeParseUnaryOperator(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_PLUS);
@@ -958,6 +1003,12 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) {
case PARSER_TOKEN_OPERATOR_MULTIPLY:
case PARSER_TOKEN_OPERATOR_DIVIDE:
case PARSER_TOKEN_OPERATOR_MODULO:
+ case PARSER_TOKEN_OPERATOR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_NOT_EQUAL:
+ case PARSER_TOKEN_OPERATOR_GREATER:
+ case PARSER_TOKEN_OPERATOR_SMALLER:
+ case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_FUNCTION_CALL:
printError(node->str_begin, node->str_end, "Unexpected %s",
@@ -1350,6 +1401,12 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode,
case PARSER_TOKEN_OPERATOR_MULTIPLY:
case PARSER_TOKEN_OPERATOR_DIVIDE:
case PARSER_TOKEN_OPERATOR_MODULO:
+ case PARSER_TOKEN_OPERATOR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_NOT_EQUAL:
+ case PARSER_TOKEN_OPERATOR_GREATER:
+ case PARSER_TOKEN_OPERATOR_SMALLER:
+ case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_FUNCTION_CALL:
printError(node->str_begin, node->str_end, "Unexpected %s",
@@ -1431,6 +1488,12 @@ AstTreeFunction *getFunction(AstTree *value) {
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:
return NULL;
case AST_TREE_TOKEN_NONE:
@@ -1464,6 +1527,12 @@ bool isConst(AstTree *value) {
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:
return false;
case AST_TREE_TOKEN_VARIABLE: {
@@ -1530,6 +1599,14 @@ AstTree *makeTypeOf(AstTree *value) {
AstTreeInfix *metadata = value->metadata;
return copyAstTree(metadata->left.type);
}
+ 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: {
+ return &AST_TREE_BOOL_TYPE;
+ }
case AST_TREE_TOKEN_VARIABLE_DEFINE:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
case AST_TREE_TOKEN_KEYWORD_RETURN:
@@ -1556,6 +1633,12 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
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_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_SCOPE:
@@ -1616,7 +1699,13 @@ bool isCircularDependencies(AstTreeHelper *helper, AstTreeVariable *variable,
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_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: {
AstTreeInfix *metadata = tree->metadata;
return isCircularDependencies(helper, variable, &metadata->left) ||
isCircularDependencies(helper, variable, &metadata->right);
@@ -1719,6 +1808,13 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
case AST_TREE_TOKEN_OPERATOR_DIVIDE:
case AST_TREE_TOKEN_OPERATOR_MODULO:
return setTypesOperatorInfix(tree, helper);
+ 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:
+ return setTypesOperatorInfixWithRet(tree, &AST_TREE_BOOL_TYPE, helper);
case AST_TREE_TOKEN_VARIABLE_DEFINE:
return setTypesVariableDefine(tree, helper);
case AST_TREE_TOKEN_KEYWORD_IF:
@@ -1774,6 +1870,7 @@ bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) {
}
bool setTypesPrintU64(AstTree *tree, AstTreeSetTypesHelper _helper) {
+ (void)(_helper);
AstTreeSingleChild *metadata = tree->metadata;
AstTreeSetTypesHelper helper = {
.lookingType = &AST_TREE_U64_TYPE,
@@ -1894,6 +1991,20 @@ bool setTypesOperatorInfix(AstTree *tree, AstTreeSetTypesHelper helper) {
}
}
+bool setTypesOperatorInfixWithRet(AstTree *tree, AstTree *retType,
+ AstTreeSetTypesHelper helper) {
+ AstTreeInfix *infix = tree->metadata;
+ if (!setTypesAstInfix(infix, helper)) {
+ return false;
+ } else if (!typeIsEqual(infix->left.type, infix->right.type)) {
+ printError(tree->str_begin, tree->str_end, "Type mismatch");
+ return false;
+ } else {
+ tree->type = retType;
+ return true;
+ }
+}
+
bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeSingleChild *operand = tree->metadata;
if (!setAllTypes(operand, helper, NULL)) {
@@ -1912,6 +2023,7 @@ bool setTypesVariableDefine(AstTree *tree, AstTreeSetTypesHelper helper) {
bool setTypesAstVariable(AstTreeVariable *variable,
AstTreeSetTypesHelper _helper) {
+ (void)_helper;
AstTreeSetTypesHelper helper = {
.lookingType = &AST_TREE_TYPE_TYPE,
};
@@ -2030,6 +2142,12 @@ bool astTreeClean(AstTree *tree) {
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:
return true;
case AST_TREE_TOKEN_NONE:
@@ -2125,6 +2243,12 @@ size_t astTreeTypeSize(AstTree tree) {
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_KEYWORD_IF:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE: