aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-31 00:57:45 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-05-31 00:57:45 +0330
commitb89fc3da7d9f1badde2f4879924b5df5522da203 (patch)
tree1d081ff63564fd2b7c42a374ef62d432761c4124 /src/compiler/ast-tree.c
parentc91d3a8893b9c53c5c8e4c5cff72d7caf44cfee4 (diff)
add ability to specify int type as extension
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index c778571..1018bfd 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -2452,8 +2452,7 @@ AstTree *astTreeParse(const ParserNode *parserNode) {
case PARSER_TOKEN_IDENTIFIER:
return astTreeParseIdentifier(parserNode);
case PARSER_TOKEN_VALUE_INT:
- return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_INT,
- sizeof(AstTreeInt), NULL);
+ return astTreeParseIntValue(parserNode);
case PARSER_TOKEN_VALUE_FLOAT:
return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_FLOAT,
sizeof(AstTreeFloat), NULL);
@@ -2956,6 +2955,67 @@ AstTree *astTreeParseValue(const ParserNode *parserNode, AstTreeToken token,
parserNode->str_end);
}
+AstTree *astTreeParseIntValue(const ParserNode *parserNode) {
+ ParserNodeIntMetadata *node_metadata = parserNode->metadata;
+ switch (node_metadata->type) {
+ case PARSER_NODE_INT_TYPE_UNKNOWN: {
+ AstTreeInt *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_VALUE_INT, metadata, NULL,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_I8: {
+ i8 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I8_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_U8: {
+ u8 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I8_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_I16: {
+ i16 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I16_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_U16: {
+ u16 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I16_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_I32: {
+ i32 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I32_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_U32: {
+ u32 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I32_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_I64: {
+ i64 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I64_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ case PARSER_NODE_INT_TYPE_U64: {
+ u64 *metadata = a404m_malloc(sizeof(*metadata));
+ *metadata = node_metadata->value;
+ return newAstTree(AST_TREE_TOKEN_RAW_VALUE, metadata, &AST_TREE_I64_TYPE,
+ parserNode->str_begin, parserNode->str_end);
+ }
+ }
+ UNREACHABLE;
+}
+
AstTree *astTreeParseString(const ParserNode *parserNode) {
ParserNodeStringMetadata *node_metadata = parserNode->metadata;