summaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-11 00:00:35 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-11 00:00:35 +0330
commitdecaf9321cbf119d1efea0c4667f49b0ab2e8c96 (patch)
treea6352e2ef68a83514a15f4f57a87430383e47e04 /src/compiler/ast-tree.c
parent6d127edfa0162219c54b10e3496a3e9530f62792 (diff)
add unary + -
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c58
1 files changed, 57 insertions, 1 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index d7769bc..3fd1dd5 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -115,6 +115,8 @@ void astTreePrint(const AstTree *tree, int indent) {
case AST_TREE_TOKEN_VALUE_VOID:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
goto RETURN_SUCCESS;
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64: {
AstTreeSingleChild *metadata = tree->metadata;
printf(",\n");
@@ -260,6 +262,8 @@ void astTreeDestroy(AstTree tree) {
case AST_TREE_TOKEN_VALUE_BOOL:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
return;
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64: {
AstTreeSingleChild *metadata = tree.metadata;
astTreeDelete(metadata);
@@ -424,6 +428,8 @@ AstTree *copyAstTree(AstTree *tree) {
return newAstTree(tree->token, new_metadata, copyAstTree(tree->type),
tree->str_begin, tree->str_end);
}
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64: {
AstTreeSingleChild *metadata = tree->metadata;
AstTreeSingleChild *new_metadata = copyAstTree(metadata);
@@ -461,7 +467,6 @@ AstTree *copyAstTree(AstTree *tree) {
case AST_TREE_TOKEN_NONE:
}
printLog("Bad token %ld", tree->token);
- *(int *)(NULL) = 2;
UNREACHABLE;
}
@@ -570,6 +575,8 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_SYMBOL_PARENTHESIS:
case PARSER_TOKEN_SYMBOL_COMMA:
case PARSER_TOKEN_OPERATOR_ASSIGN:
+ case PARSER_TOKEN_OPERATOR_PLUS:
+ case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_OPERATOR_SUM:
case PARSER_TOKEN_OPERATOR_SUB:
case PARSER_TOKEN_OPERATOR_MULTIPLY:
@@ -712,6 +719,12 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeVariables **variables,
case PARSER_TOKEN_OPERATOR_MODULO:
return astTreeParseBinaryOperator(parserNode, variables, variables_size,
AST_TREE_TOKEN_OPERATOR_MODULO);
+ case PARSER_TOKEN_OPERATOR_PLUS:
+ return astTreeParseUnaryOperator(parserNode, variables, variables_size,
+ AST_TREE_TOKEN_OPERATOR_PLUS);
+ case PARSER_TOKEN_OPERATOR_MINUS:
+ return astTreeParseUnaryOperator(parserNode, variables, variables_size,
+ AST_TREE_TOKEN_OPERATOR_MINUS);
case PARSER_TOKEN_VARIABLE:
return astTreeParseVariable(parserNode, variables, variables_size);
case PARSER_TOKEN_CONSTANT:
@@ -1005,6 +1018,21 @@ AstTree *astTreeParseBinaryOperator(ParserNode *parserNode,
parserNode->str_end);
}
+AstTree *astTreeParseUnaryOperator(ParserNode *parserNode,
+ AstTreeVariables **variables,
+ size_t variables_size, AstTreeToken token) {
+ ParserNodeSingleChildMetadata *node_metadata = parserNode->metadata;
+
+ AstTreeSingleChild *metadata =
+ astTreeParse(node_metadata, variables, variables_size);
+ if (metadata == NULL) {
+ return NULL;
+ }
+
+ return newAstTree(token, metadata, NULL, parserNode->str_begin,
+ parserNode->str_end);
+}
+
bool astTreeParseConstant(ParserNode *parserNode, AstTreeVariables **variables,
size_t variables_size) {
ParserNodeVariableMetadata *node_metadata = parserNode->metadata;
@@ -1122,6 +1150,8 @@ AstTreeFunction *getFunction(AstTree *value) {
case AST_TREE_TOKEN_VALUE_BOOL:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
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:
@@ -1150,6 +1180,8 @@ bool isConst(AstTree *value) {
case AST_TREE_TOKEN_FUNCTION_CALL:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
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:
@@ -1205,6 +1237,11 @@ AstTree *makeTypeOf(AstTree *value) {
AstTreeVariable *variable = value->metadata;
return copyAstTree(variable->type);
}
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS: {
+ AstTreeSingleChild *metadata = value->metadata;
+ return copyAstTree(metadata->type);
+ }
case AST_TREE_TOKEN_OPERATOR_ASSIGN:
case AST_TREE_TOKEN_OPERATOR_SUM:
case AST_TREE_TOKEN_OPERATOR_SUB:
@@ -1237,6 +1274,8 @@ 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_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
return false;
case AST_TREE_TOKEN_TYPE_TYPE:
case AST_TREE_TOKEN_TYPE_VOID:
@@ -1312,6 +1351,9 @@ bool setAllTypes(AstTree *tree, AstTreeFunction *function) {
return setTypesVariable(tree);
case AST_TREE_TOKEN_OPERATOR_ASSIGN:
return setTypesOperatorAssign(tree);
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
+ return setTypesOperatorUnary(tree);
case AST_TREE_TOKEN_OPERATOR_SUM:
case AST_TREE_TOKEN_OPERATOR_SUB:
case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
@@ -1470,6 +1512,16 @@ bool setTypesOperatorInfix(AstTree *tree) {
}
}
+bool setTypesOperatorUnary(AstTree *tree) {
+ AstTreeSingleChild *operand = tree->metadata;
+ if (!setAllTypes(operand, NULL)) {
+ return false;
+ } else {
+ tree->type = copyAstTree(operand->type);
+ return true;
+ }
+}
+
bool setTypesVariableDefine(AstTree *tree) {
AstTreeVariable *metadata = tree->metadata;
tree->type = &AST_TREE_VOID_TYPE;
@@ -1527,6 +1579,8 @@ bool astTreeClean(AstTree *tree) {
case AST_TREE_TOKEN_VALUE_BOOL:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
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:
@@ -1617,6 +1671,8 @@ size_t astTreeTypeSize(AstTree tree) {
case AST_TREE_TOKEN_VALUE_U64:
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: