diff options
-rw-r--r-- | code/main.felan | 33 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 65 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 3 | ||||
-rw-r--r-- | src/compiler/parser.c | 16 | ||||
-rw-r--r-- | src/runner/runner.c | 2 |
5 files changed, 57 insertions, 62 deletions
diff --git a/code/main.felan b/code/main.felan index cd32cce..07500ac 100644 --- a/code/main.felan +++ b/code/main.felan @@ -1,29 +1,12 @@ +char :: u8; +short :: i16; +int :: i32; +long :: i64; +float :: f32; +double :: f64; + main :: () -> void { - a :u64= 1; - a1 :u64= 9; - b := &a; - b1 :*u64= &a1; - c := &b; - print_u64 b.*; - print_u64 a; - a = 2; - print_u64 b.*; - print_u64 a; - b.* = 3; - print_u64 b.*; - print_u64 a; - foo(a); - print_u64 b.*; - print_u64 a; - bar(b); - print_u64 b.*; - print_u64 a; - print_u64 c.*.*; - c.*.* = 6; - b = b1; - print_u64 b.*; - print_u64 a; - print_u64 c.*.*; + a : int = 2; }; foo :: (a:u64)->void{ diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 71429f1..bd0ba20 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -250,8 +250,8 @@ void astTreePrint(const AstTree *tree, int indent) { } goto RETURN_SUCCESS; case AST_TREE_TOKEN_VALUE_INT: { - AstTreeInt metadata = (AstTreeInt)tree->metadata; - printf(",value=%lu", metadata); + AstTreeInt *metadata = tree->metadata; + printf(",value=%lu", *metadata); } goto RETURN_SUCCESS; case AST_TREE_TOKEN_VALUE_FLOAT: { @@ -457,10 +457,14 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_VOID: - case AST_TREE_TOKEN_VALUE_INT: case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VARIABLE_DEFINE: return; + case AST_TREE_TOKEN_VALUE_INT: { + AstTreeInt *metadata = tree.metadata; + free(metadata); + return; + } case AST_TREE_TOKEN_VALUE_FLOAT: { AstTreeFloat *metadata = tree.metadata; free(metadata); @@ -638,10 +642,16 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], tree->token, NULL, copyAstTreeBack(tree->type, oldVariables, newVariables, variables_size), tree->str_begin, tree->str_end); - case AST_TREE_TOKEN_VALUE_INT: case AST_TREE_TOKEN_VALUE_BOOL: return newAstTree(tree->token, tree->metadata, tree->type, tree->str_begin, tree->str_end); + case AST_TREE_TOKEN_VALUE_INT: { + AstTreeInt *metadata = tree->metadata; + AstTreeInt *newMetadata = a404m_malloc(sizeof(*newMetadata)); + *newMetadata = *metadata; + return newAstTree(tree->token, newMetadata, tree->type, tree->str_begin, + tree->str_end); + } case AST_TREE_TOKEN_VALUE_FLOAT: { AstTreeFloat *metadata = tree->metadata; AstTreeFloat *newMetadata = a404m_malloc(sizeof(*newMetadata)); @@ -1203,12 +1213,11 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { case PARSER_TOKEN_IDENTIFIER: return astTreeParseIdentifier(parserNode, helper); case PARSER_TOKEN_VALUE_INT: - return newAstTree( - AST_TREE_TOKEN_VALUE_INT, - (void *)(AstTreeInt)(ParserNodeIntMetadata)parserNode->metadata, NULL, - parserNode->str_begin, parserNode->str_end); + return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_INT, + sizeof(AstTreeInt)); case PARSER_TOKEN_VALUE_FLOAT: - return astTreeParseFloat(parserNode); + return astTreeParseValue(parserNode, AST_TREE_TOKEN_VALUE_FLOAT, + sizeof(AstTreeFloat)); case PARSER_TOKEN_VALUE_BOOL: return newAstTree( AST_TREE_TOKEN_VALUE_BOOL, @@ -1607,15 +1616,13 @@ AstTree *astTreeParseIdentifier(ParserNode *parserNode, AstTreeHelper *helper) { parserNode->str_end); } -AstTree *astTreeParseFloat(ParserNode *parserNode) { - AstTreeFloat *metadata = a404m_malloc(sizeof(*metadata)); - - ParserNodeFloatMetadata *node_metadata = parserNode->metadata; - - *metadata = *node_metadata; +AstTree *astTreeParseValue(ParserNode *parserNode, AstTreeToken token, + size_t metadata_size) { + void *metadata = a404m_malloc(sizeof(metadata)); + memcpy(metadata, parserNode->metadata, metadata_size); - return newAstTree(AST_TREE_TOKEN_VALUE_FLOAT, metadata, NULL, - parserNode->str_begin, parserNode->str_end); + return newAstTree(token, metadata, NULL, parserNode->str_begin, + parserNode->str_end); } AstTree *astTreeParseKeyword(ParserNode *parserNode, AstTreeToken token) { @@ -2059,8 +2066,10 @@ AstTreeFunction *getFunction(AstTree *value) { case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: case AST_TREE_TOKEN_TYPE_BOOL: + case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_VOID: case AST_TREE_TOKEN_VALUE_INT: + case AST_TREE_TOKEN_VALUE_FLOAT: case AST_TREE_TOKEN_VALUE_BOOL: case AST_TREE_TOKEN_VARIABLE_DEFINE: case AST_TREE_TOKEN_OPERATOR_ASSIGN: @@ -2082,8 +2091,6 @@ AstTreeFunction *getFunction(AstTree *value) { case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_KEYWORD_WHILE: - case AST_TREE_TOKEN_VALUE_FLOAT: - case AST_TREE_TOKEN_VALUE_NULL: return NULL; case AST_TREE_TOKEN_NONE: } @@ -2687,7 +2694,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } else if (typeIsEqual(helper.lookingType, &AST_TREE_U64_TYPE)) { tree->type = &AST_TREE_U64_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_I32_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; i32 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2695,7 +2702,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } tree->type = &AST_TREE_I32_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_U32_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; u32 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2703,7 +2710,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } tree->type = &AST_TREE_U32_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_I16_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; i16 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2711,7 +2718,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } tree->type = &AST_TREE_I16_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_U16_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; u16 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2719,7 +2726,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } tree->type = &AST_TREE_U16_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_I8_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; i8 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2727,7 +2734,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { } tree->type = &AST_TREE_I8_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_U8_TYPE)) { - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; u8 newValue = value; tree->metadata = (void *)(u64)newValue; if (value - newValue != 0) { @@ -2736,7 +2743,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_U8_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_F16_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; f16 newValue = value; tree->metadata = a404m_malloc(sizeof(f128)); *(AstTreeFloat *)tree->metadata = value; @@ -2746,7 +2753,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_F16_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_F32_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; f32 newValue = value; tree->metadata = a404m_malloc(sizeof(f128)); *(AstTreeFloat *)tree->metadata = value; @@ -2756,7 +2763,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_F32_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_F64_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; f64 newValue = value; tree->metadata = a404m_malloc(sizeof(f128)); *(AstTreeFloat *)tree->metadata = value; @@ -2766,7 +2773,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_F64_TYPE; } else if (typeIsEqual(helper.lookingType, &AST_TREE_F128_TYPE)) { tree->token = AST_TREE_TOKEN_VALUE_FLOAT; - AstTreeInt value = (AstTreeInt)tree->metadata; + AstTreeInt value = *(AstTreeInt *)tree->metadata; f128 newValue = value; tree->metadata = a404m_malloc(sizeof(f128)); *(AstTreeFloat *)tree->metadata = value; diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 6ce8c64..a553a1d 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -213,7 +213,8 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode, AstTree *astTreeParseFunctionCall(ParserNode *parserNode, AstTreeHelper *helper); AstTree *astTreeParseIdentifier(ParserNode *parserNode, AstTreeHelper *helper); -AstTree *astTreeParseFloat(ParserNode *parserNode); +AstTree *astTreeParseValue(ParserNode *parserNode, AstTreeToken token, + size_t metadata_size); AstTree *astTreeParseKeyword(ParserNode *parserNode, AstTreeToken token); AstTree *astTreeParsePrintU64(ParserNode *parserNode, AstTreeHelper *helper); AstTree *astTreeParseReturn(ParserNode *parserNode, AstTreeHelper *helper); diff --git a/src/compiler/parser.c b/src/compiler/parser.c index d508110..ec84c8c 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -208,8 +208,8 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_KEYWORD_NULL: goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_INT: { - ParserNodeIntMetadata metadata = (ParserNodeIntMetadata)node->metadata; - printf(",operand=%ld", metadata); + ParserNodeIntMetadata *metadata = node->metadata; + printf(",operand=%ld", *metadata); } goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_FLOAT: { @@ -455,10 +455,13 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: - case PARSER_TOKEN_VALUE_INT: case PARSER_TOKEN_VALUE_BOOL: case PARSER_TOKEN_KEYWORD_NULL: goto RETURN_SUCCESS; + case PARSER_TOKEN_VALUE_INT: { + ParserNodeIntMetadata *metadata = node->metadata; + free(metadata); + } case PARSER_TOKEN_VALUE_FLOAT: { ParserNodeFloatMetadata *metadata = node->metadata; free(metadata); @@ -953,9 +956,10 @@ ParserNode *parserNumber(LexerNode *node, ParserNode *parent) { bool success; u64 value = decimalToU64(node->str_begin, node->str_end, &success); if (success) { - parserNode = - newParserNode(PARSER_TOKEN_VALUE_INT, node->str_begin, node->str_end, - (void *)(ParserNodeIntMetadata)value, parent); + ParserNodeIntMetadata *metadata = a404m_malloc(sizeof(*metadata)); + *metadata = value; + parserNode = newParserNode(PARSER_TOKEN_VALUE_INT, node->str_begin, + node->str_end, metadata, parent); } else { ParserNodeFloatMetadata *metadata = a404m_malloc(sizeof(*metadata)); *metadata = numberToFloat(node->str_begin, node->str_end, &success); diff --git a/src/runner/runner.c b/src/runner/runner.c index 2c38f74..bc15a90 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -163,7 +163,7 @@ AstTree *runExpression(AstTree *expr, bool *shouldRet) { case AST_TREE_TOKEN_KEYWORD_PRINT_U64: { AstTreeSingleChild *metadata = expr->metadata; AstTree *tree = runExpression(metadata, shouldRet); - printf("%lu", (AstTreeInt)tree->metadata); + printf("%lu", *(AstTreeInt *)tree->metadata); astTreeDelete(tree); return &AST_TREE_VOID_VALUE; } |