diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-27 01:25:24 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-01-27 01:25:24 +0330 |
commit | 64331c144518b8ab1c3cf08473771e0d3f14f67b (patch) | |
tree | c378fccbddcc4e0972a7a426b4bf464efc1129bf /src/compiler/ast-tree.c | |
parent | bb87887ec288f341256d324f271bac6267fc83f4 (diff) |
add print_u64 to be able to print u64 numbers
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r-- | src/compiler/ast-tree.c | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 729aa18..22ce146 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -7,9 +7,14 @@ #include <string.h> const char *AST_TREE_TOKEN_STRINGS[] = { - "AST_TREE_TOKEN_FUNCTION", "AST_TREE_TOKEN_KEYWORD_PRINT", - "AST_TREE_TOKEN_NONE", "AST_TREE_TOKEN_TYPE_FUNCTION", - "AST_TREE_TOKEN_TYPE_VOID", "AST_TREE_TOKEN_FUNCTION_CALL", + "AST_TREE_TOKEN_FUNCTION", + "AST_TREE_TOKEN_KEYWORD_PRINT", + "AST_TREE_TOKEN_KEYWORD_PRINT_U64", + + "AST_TREE_TOKEN_NONE", + "AST_TREE_TOKEN_TYPE_FUNCTION", + "AST_TREE_TOKEN_TYPE_VOID", + "AST_TREE_TOKEN_FUNCTION_CALL", "AST_TREE_TOKEN_IDENTIFIER", }; @@ -58,6 +63,20 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_KEYWORD_PRINT: case AST_TREE_TOKEN_TYPE_VOID: goto RETURN_SUCCESS; + case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { + AstTreeSingleChild *metadata = tree->metadata; + printf(",\n"); + for (int i = 0; i < indent; ++i) + printf(" "); + printf("child=\n"); + astTreePrint(metadata, indent + 1); + } + goto RETURN_SUCCESS; + case AST_TREE_TOKEN_VALUE_U64: { + AstTreeU64 metadata = (AstTreeU64)tree->metadata; + printf(",value=%lu", metadata); + } + goto RETURN_SUCCESS; case AST_TREE_TOKEN_TYPE_FUNCTION: { AstTreeTypeFunction *metadata = tree->metadata; printf(",\n"); @@ -143,6 +162,12 @@ void astTreeDestroy(AstTree tree) { return; case AST_TREE_TOKEN_KEYWORD_PRINT: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_VALUE_U64: + return; + case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { + AstTreeSingleChild *metadata = tree.metadata; + astTreeDelete(metadata); + } return; case AST_TREE_TOKEN_TYPE_FUNCTION: { AstTreeTypeFunction *metadata = tree.metadata; @@ -224,7 +249,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { printLog("Unexpected %s", PARSER_TOKEN_STRINGS[eol->token]); goto RETURN_ERROR; } - ParserNode *node = (ParserNodeEOLMetadata *)eol->metadata; + ParserNode *node = (ParserNodeSingleChildMetadata *)eol->metadata; if (node->token != PARSER_TOKEN_CONSTANT) { printLog("Unexpected %s", PARSER_TOKEN_STRINGS[node->token]); goto RETURN_ERROR; @@ -239,7 +264,8 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { } for (size_t i = 0; i < nodes->size; ++i) { - ParserNode *node = (ParserNodeEOLMetadata *)nodes->data[i]->metadata; + ParserNode *node = + (ParserNodeSingleChildMetadata *)nodes->data[i]->metadata; ParserNodeVariableMetadata *node_metadata = node->metadata; AstTree *type; @@ -319,6 +345,12 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeVariables *variables, return astTreeParseFunctionCall(parserNode, variables, variables_size); case PARSER_TOKEN_IDENTIFIER: return astTreeParseIdentifier(parserNode, variables, variables_size); + case PARSER_TOKEN_VALUE_U64: + return newAstTree( + AST_TREE_TOKEN_VALUE_U64, + (void *)(AstTreeU64)(ParserNodeU64Metadata)parserNode->metadata); + case PARSER_TOKEN_KEYWORD_PRINT_U64: + return astTreeParsePrintU64(parserNode, variables, variables_size); case PARSER_TOKEN_SYMBOL_EOL: case PARSER_TOKEN_SYMBOL_PARENTHESIS: case PARSER_TOKEN_SYMBOL_CURLY_BRACKET: @@ -393,7 +425,7 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, printLog("Unexpected %s", PARSER_TOKEN_STRINGS[eol->token]); goto RETURN_ERROR; } - ParserNode *node = (ParserNodeEOLMetadata *)eol->metadata; + ParserNode *node = (ParserNodeSingleChildMetadata *)eol->metadata; AstTree *tree = astTreeParse(node, variables, variables_size); if (tree == NULL) { @@ -528,6 +560,22 @@ AstTree *astTreeParseIdentifier(ParserNode *parserNode, return newAstTree(AST_TREE_TOKEN_IDENTIFIER, (AstTreeIdentifier *)var); } +AstTree *astTreeParsePrintU64(ParserNode *parserNode, + AstTreeVariables *variables, + size_t variables_size) { + ParserNodeSingleChildMetadata *node_metadata = parserNode->metadata; + + AstTree *operand = astTreeParse(node_metadata, variables, variables_size); + if (operand == NULL) { + return NULL; + } + + // TODO: check type to be u64 + + return newAstTree(AST_TREE_TOKEN_KEYWORD_PRINT_U64, + (AstTreeSingleChild *)operand); +} + bool hasTypeOf(AstTree *value, AstTree *type) { switch (type->token) { case AST_TREE_TOKEN_TYPE_FUNCTION: @@ -576,9 +624,9 @@ bool typeIsEqual(AstTree *type0, AstTree *type1) { case AST_TREE_TOKEN_TYPE_VOID: return type1->token == AST_TREE_TOKEN_TYPE_VOID; case AST_TREE_TOKEN_TYPE_FUNCTION: - if(type1->token != AST_TREE_TOKEN_TYPE_FUNCTION){ - return false; - } + if (type1->token != AST_TREE_TOKEN_TYPE_FUNCTION) { + return false; + } printLog("Not implemented yet"); exit(1); case AST_TREE_TOKEN_FUNCTION_CALL: |