summaryrefslogtreecommitdiff
path: root/src/compiler/ast-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/ast-tree.c')
-rw-r--r--src/compiler/ast-tree.c114
1 files changed, 91 insertions, 23 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index c3854b9..1bfda8c 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -129,11 +129,12 @@ const char *AST_TREE_TOKEN_STRINGS[] = {
"AST_TREE_TOKEN_TYPE_F64",
"AST_TREE_TOKEN_TYPE_F128",
"AST_TREE_TOKEN_TYPE_BOOL",
+ "AST_TREE_TOKEN_VALUE_VOID",
"AST_TREE_TOKEN_FUNCTION_CALL",
"AST_TREE_TOKEN_VARIABLE",
"AST_TREE_TOKEN_VARIABLE_DEFINE",
- "AST_TREE_TOKEN_VALUE_VOID",
+ "AST_TREE_TOKEN_VALUE_NULL",
"AST_TREE_TOKEN_VALUE_INT",
"AST_TREE_TOKEN_VALUE_FLOAT",
"AST_TREE_TOKEN_VALUE_BOOL",
@@ -152,6 +153,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = {
"AST_TREE_TOKEN_OPERATOR_SMALLER",
"AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL",
"AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL",
+ "AST_TREE_TOKEN_OPERATOR_POINTER",
"AST_TREE_TOKEN_SCOPE",
@@ -216,8 +218,10 @@ void astTreePrint(const AstTree *tree, int indent) {
case AST_TREE_TOKEN_TYPE_F128:
case AST_TREE_TOKEN_TYPE_BOOL:
case AST_TREE_TOKEN_VALUE_VOID:
+ case AST_TREE_TOKEN_VALUE_NULL:
case AST_TREE_TOKEN_VARIABLE_DEFINE:
goto RETURN_SUCCESS;
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
case AST_TREE_TOKEN_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
@@ -447,6 +451,7 @@ void astTreeDestroy(AstTree tree) {
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_BOOL:
@@ -457,6 +462,7 @@ void astTreeDestroy(AstTree tree) {
free(metadata);
return;
}
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
case AST_TREE_TOKEN_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
@@ -614,6 +620,7 @@ AstTree *copyAstTree(AstTree *tree) {
case AST_TREE_TOKEN_TYPE_F32:
case AST_TREE_TOKEN_TYPE_F64:
case AST_TREE_TOKEN_TYPE_F128:
+ case AST_TREE_TOKEN_VALUE_NULL:
case AST_TREE_TOKEN_VALUE_VOID:
return tree;
case AST_TREE_TOKEN_VALUE_INT:
@@ -689,6 +696,7 @@ AstTree *copyAstTree(AstTree *tree) {
return newAstTree(tree->token, new_metadata, copyAstTree(tree->type),
tree->str_begin, tree->str_end);
}
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
case AST_TREE_TOKEN_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
@@ -836,6 +844,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
}
switch (node_metadata->value->token) {
+ case PARSER_TOKEN_KEYWORD_NULL:
case PARSER_TOKEN_VALUE_BOOL:
case PARSER_TOKEN_VALUE_INT:
case PARSER_TOKEN_VALUE_FLOAT:
@@ -881,6 +890,7 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) {
case PARSER_TOKEN_TYPE_F64:
case PARSER_TOKEN_TYPE_F128:
case PARSER_TOKEN_TYPE_BOOL:
+ case PARSER_TOKEN_OPERATOR_POINTER:
goto AFTER_SWITCH;
case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_KEYWORD_PRINT_U64:
@@ -1056,6 +1066,8 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) {
AST_TREE_TOKEN_VALUE_BOOL,
(void *)(AstTreeBool)(ParserNodeBoolMetadata)parserNode->metadata,
&AST_TREE_BOOL_TYPE, parserNode->str_begin, parserNode->str_end);
+ case PARSER_TOKEN_KEYWORD_NULL:
+ return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_VALUE_NULL);
case PARSER_TOKEN_KEYWORD_PRINT_U64:
return astTreeParsePrintU64(parserNode, helper);
case PARSER_TOKEN_KEYWORD_RETURN:
@@ -1117,6 +1129,9 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) {
case PARSER_TOKEN_OPERATOR_MINUS:
return astTreeParseUnaryOperator(parserNode, helper,
AST_TREE_TOKEN_OPERATOR_MINUS);
+ case PARSER_TOKEN_OPERATOR_POINTER:
+ return astTreeParseUnaryOperator(parserNode, helper,
+ AST_TREE_TOKEN_OPERATOR_POINTER);
case PARSER_TOKEN_VARIABLE:
return astTreeParseVariable(parserNode, helper);
case PARSER_TOKEN_KEYWORD_IF:
@@ -1271,6 +1286,8 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) {
case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_FUNCTION_CALL:
+ case PARSER_TOKEN_KEYWORD_NULL:
+ case PARSER_TOKEN_OPERATOR_POINTER:
printError(node->str_begin, node->str_end, "Unexpected %s",
PARSER_TOKEN_STRINGS[node->token]);
goto RETURN_ERROR;
@@ -1349,8 +1366,7 @@ AstTree *astTreeParseTypeFunction(ParserNode *parserNode,
}
if (!typeIsEqual(argument->type, &AST_TREE_TYPE_TYPE)) {
- printError(argument->str_begin, argument->str_end,
- "Not yet supported");
+ printError(argument->str_begin, argument->str_end, "Not yet supported");
return NULL;
}
}
@@ -1446,6 +1462,11 @@ AstTree *astTreeParseFloat(ParserNode *parserNode) {
parserNode->str_begin, parserNode->str_end);
}
+AstTree *astTreeParseKeyword(ParserNode *parserNode, AstTreeToken token) {
+ return newAstTree(token, NULL, NULL, parserNode->str_begin,
+ parserNode->str_end);
+}
+
AstTree *astTreeParsePrintU64(ParserNode *parserNode, AstTreeHelper *helper) {
ParserNodeSingleChildMetadata *node_metadata = parserNode->metadata;
@@ -1788,6 +1809,8 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode,
case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_FUNCTION_CALL:
+ case PARSER_TOKEN_KEYWORD_NULL:
+ case PARSER_TOKEN_OPERATOR_POINTER:
printError(node->str_begin, node->str_end, "Unexpected %s",
PARSER_TOKEN_STRINGS[node->token]);
goto RETURN_ERROR;
@@ -1883,6 +1906,7 @@ 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_POINTER:
case AST_TREE_TOKEN_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS:
case AST_TREE_TOKEN_OPERATOR_SUM:
@@ -1899,6 +1923,7 @@ AstTreeFunction *getFunction(AstTree *value) {
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:
}
@@ -1923,6 +1948,7 @@ bool isConst(AstTree *tree, AstTreeHelper *helper) {
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:
@@ -1971,6 +1997,10 @@ bool isConst(AstTree *tree, AstTreeHelper *helper) {
AstTreeVariable *metadata = tree->metadata;
return metadata->isConst;
}
+ case AST_TREE_TOKEN_OPERATOR_POINTER: {
+ AstTreeSingleChild *metadata = tree->metadata;
+ return isConst(metadata, helper);
+ }
case AST_TREE_TOKEN_NONE:
}
UNREACHABLE;
@@ -1994,6 +2024,7 @@ AstTree *makeTypeOf(AstTree *value) {
case AST_TREE_TOKEN_TYPE_F64:
case AST_TREE_TOKEN_TYPE_F128:
case AST_TREE_TOKEN_TYPE_BOOL:
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
return &AST_TREE_TYPE_TYPE;
case AST_TREE_TOKEN_FUNCTION_CALL: {
AstTreeFunctionCall *metadata = value->metadata;
@@ -2071,6 +2102,7 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
case AST_TREE_TOKEN_KEYWORD_IF:
case AST_TREE_TOKEN_KEYWORD_WHILE:
case AST_TREE_TOKEN_KEYWORD_COMPTIME:
+ case AST_TREE_TOKEN_VALUE_NULL:
case AST_TREE_TOKEN_VALUE_VOID:
case AST_TREE_TOKEN_VALUE_INT:
case AST_TREE_TOKEN_VALUE_FLOAT:
@@ -2108,6 +2140,14 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
case AST_TREE_TOKEN_TYPE_F64:
case AST_TREE_TOKEN_TYPE_F128:
return type1->token == type0->token;
+ case AST_TREE_TOKEN_OPERATOR_POINTER: {
+ if (type1->token != AST_TREE_TOKEN_OPERATOR_POINTER) {
+ return false;
+ }
+ AstTreeSingleChild *type0_metadata = type0->metadata;
+ AstTreeSingleChild *type1_metadata = type1->metadata;
+ return typeIsEqual(type0_metadata, type1_metadata);
+ }
case AST_TREE_TOKEN_TYPE_FUNCTION:
if (type1->token != AST_TREE_TOKEN_TYPE_FUNCTION) {
return false;
@@ -2115,10 +2155,8 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
AstTreeTypeFunction *type0_metadata = type0->metadata;
AstTreeTypeFunction *type1_metadata = type1->metadata;
if (!typeIsEqual(type0_metadata->returnType->type,
- type1_metadata->returnType->type)) {
- return false;
- }
- if (type0_metadata->arguments_size != type1_metadata->arguments_size) {
+ type1_metadata->returnType->type) ||
+ type0_metadata->arguments_size != type1_metadata->arguments_size) {
return false;
}
for (size_t i = 0; i < type0_metadata->arguments_size; ++i) {
@@ -2163,6 +2201,7 @@ AstTree *getValue(AstTree *tree, AstTreeSetTypesHelper helper) {
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:
@@ -2183,6 +2222,7 @@ AstTree *getValue(AstTree *tree, AstTreeSetTypesHelper helper) {
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_POINTER:
case AST_TREE_TOKEN_KEYWORD_IF:
case AST_TREE_TOKEN_KEYWORD_WHILE:
case AST_TREE_TOKEN_KEYWORD_COMPTIME:
@@ -2237,11 +2277,13 @@ bool isCircularDependenciesBack(AstTreeHelper *helper,
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:
return false;
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
case AST_TREE_TOKEN_KEYWORD_COMPTIME:
case AST_TREE_TOKEN_OPERATOR_PLUS:
case AST_TREE_TOKEN_OPERATOR_MINUS: {
@@ -2403,6 +2445,8 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
return setTypesValueInt(tree, helper);
case AST_TREE_TOKEN_VALUE_FLOAT:
return setTypesValueFloat(tree, helper);
+ case AST_TREE_TOKEN_VALUE_NULL:
+ return setTypesValueNull(tree, helper);
case AST_TREE_TOKEN_FUNCTION:
return setTypesFunction(tree, helper);
case AST_TREE_TOKEN_KEYWORD_PRINT_U64:
@@ -2433,6 +2477,8 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
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_OPERATOR_POINTER:
+ return setTypesOperatorIndirection(tree, helper);
case AST_TREE_TOKEN_VARIABLE_DEFINE:
return setTypesVariableDefine(tree, helper);
case AST_TREE_TOKEN_KEYWORD_IF:
@@ -2446,15 +2492,17 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
case AST_TREE_TOKEN_NONE:
break;
}
+ printError(tree->str_begin, tree->str_end, "Unknown token %d", tree->token);
UNREACHABLE;
}
bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
- if (helper.lookingType == NULL || typeIsEqual(helper.lookingType,&AST_TREE_I64_TYPE)) {
+ if (helper.lookingType == NULL ||
+ typeIsEqual(helper.lookingType, &AST_TREE_I64_TYPE)) {
tree->type = &AST_TREE_I64_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_U64_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_U64_TYPE)) {
tree->type = &AST_TREE_U64_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_I32_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_I32_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
i32 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2462,7 +2510,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_I32_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_U32_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_U32_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
u32 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2470,7 +2518,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_U32_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_I16_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_I16_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
i16 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2478,7 +2526,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_I16_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_U16_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_U16_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
u16 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2486,7 +2534,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_U16_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_I8_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_I8_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
i8 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2494,7 +2542,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_I8_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_U8_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_U8_TYPE)) {
AstTreeInt value = (AstTreeInt)tree->metadata;
u8 newValue = value;
tree->metadata = (void *)(u64)newValue;
@@ -2502,7 +2550,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_U8_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F16_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F16_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeInt value = (AstTreeInt)tree->metadata;
f16 newValue = value;
@@ -2512,7 +2560,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F16_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F32_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F32_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeInt value = (AstTreeInt)tree->metadata;
f32 newValue = value;
@@ -2522,7 +2570,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F32_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F64_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F64_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeInt value = (AstTreeInt)tree->metadata;
f64 newValue = value;
@@ -2532,7 +2580,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F64_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F128_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F128_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeInt value = (AstTreeInt)tree->metadata;
f128 newValue = value;
@@ -2549,7 +2597,7 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) {
}
bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
- if (typeIsEqual(helper.lookingType,&AST_TREE_F16_TYPE)) {
+ if (typeIsEqual(helper.lookingType, &AST_TREE_F16_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeFloat value = *(AstTreeFloat *)tree->metadata;
f16 newValue = value;
@@ -2558,7 +2606,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F16_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F32_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F32_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeFloat value = *(AstTreeFloat *)tree->metadata;
f32 newValue = value;
@@ -2567,7 +2615,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F32_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F64_TYPE) ||
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F64_TYPE) ||
helper.lookingType == NULL) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeFloat value = *(AstTreeFloat *)tree->metadata;
@@ -2577,7 +2625,7 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
printWarning(tree->str_begin, tree->str_end, "Value is overflowing");
}
tree->type = &AST_TREE_F64_TYPE;
- } else if (typeIsEqual(helper.lookingType,&AST_TREE_F128_TYPE)) {
+ } else if (typeIsEqual(helper.lookingType, &AST_TREE_F128_TYPE)) {
tree->token = AST_TREE_TOKEN_VALUE_FLOAT;
AstTreeFloat value = *(AstTreeFloat *)tree->metadata;
f128 newValue = value;
@@ -2593,6 +2641,14 @@ bool setTypesValueFloat(AstTree *tree, AstTreeSetTypesHelper helper) {
return true;
}
+bool setTypesValueNull(AstTree *tree, AstTreeSetTypesHelper helper) {
+ if (helper.lookingType == NULL) {
+ return false;
+ }
+ tree->type = getValue(helper.lookingType, helper);
+ return tree->type != NULL;
+}
+
bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeFunction *metadata = tree->metadata;
@@ -2842,6 +2898,18 @@ bool setTypesOperatorUnary(AstTree *tree, AstTreeSetTypesHelper helper) {
}
}
+bool setTypesOperatorIndirection(AstTree *tree, AstTreeSetTypesHelper helper) {
+ AstTreeSingleChild *metadata = tree->metadata;
+ if (!setAllTypes(metadata, helper, NULL)) {
+ return false;
+ } else if (!typeIsEqual(metadata->type, &AST_TREE_TYPE_TYPE)) {
+ UNREACHABLE;
+ }
+
+ tree->type = &AST_TREE_TYPE_TYPE;
+ return true;
+}
+
bool setTypesVariableDefine(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTreeVariable *metadata = tree->metadata;
tree->type = &AST_TREE_VOID_TYPE;