diff options
-rw-r--r-- | code/lib/io.felan | 2 | ||||
-rw-r--r-- | code/main.felan | 10 | ||||
-rw-r--r-- | src/compiler/ast-tree.c | 75 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 2 | ||||
-rw-r--r-- | src/compiler/lexer.c | 19 | ||||
-rw-r--r-- | src/compiler/lexer.h | 1 | ||||
-rw-r--r-- | src/compiler/parser.c | 10 | ||||
-rw-r--r-- | src/compiler/parser.h | 1 | ||||
-rw-r--r-- | src/runner/runner.c | 4 |
9 files changed, 97 insertions, 27 deletions
diff --git a/code/lib/io.felan b/code/lib/io.felan index 1fe7cf9..3019092 100644 --- a/code/lib/io.felan +++ b/code/lib/io.felan @@ -1,7 +1,7 @@ @import("types.felan"); @import("operator.felan"); -libc :: @c_library("/lib/libc.so.6"); +libc :: @c_library("/usr/lib/libc.so.6"); puts :: @c_function(libc,"puts",(*u8)->i32); putchar :: @c_function(libc,"putchar",(i32)->void); diff --git a/code/main.felan b/code/main.felan index 90b1d08..8b5903e 100644 --- a/code/main.felan +++ b/code/main.felan @@ -1,6 +1,12 @@ -@import("basic.felan"); +@import("lib/operator.felan"); + +print :: (value:anytype) -> void { + if @type_of(value) == u8 { + @putc(value); + } +}; main :: ()->void{ - print(1234); + print('a'); }; diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index d89f816..497a791 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -19,6 +19,14 @@ AstTree AST_TREE_TYPE_TYPE = { .str_end = NULL, }; +AstTree AST_TREE_TYPE_ANY_TYPE = { + .token = AST_TREE_TOKEN_TYPE_ANY_TYPE, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, + .str_begin = NULL, + .str_end = NULL, +}; + AstTree AST_TREE_VOID_TYPE = { .token = AST_TREE_TOKEN_TYPE_VOID, .metadata = NULL, @@ -216,6 +224,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_TYPE_FUNCTION", "AST_TREE_TOKEN_TYPE_ARRAY", "AST_TREE_TOKEN_TYPE_TYPE", + "AST_TREE_TOKEN_TYPE_ANY_TYPE", "AST_TREE_TOKEN_TYPE_VOID", "AST_TREE_TOKEN_TYPE_I8", "AST_TREE_TOKEN_TYPE_U8", @@ -368,6 +377,7 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: case AST_TREE_TOKEN_TYPE_U8: @@ -820,6 +830,7 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: case AST_TREE_TOKEN_TYPE_U8: @@ -1087,12 +1098,12 @@ void astTreeDelete(AstTree *tree) { } bool astTreeShouldDelete(AstTree *tree) { - return tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_VOID_TYPE && - tree != &AST_TREE_BOOL_TYPE && tree != &AST_TREE_I8_TYPE && - tree != &AST_TREE_U8_TYPE && tree != &AST_TREE_I16_TYPE && - tree != &AST_TREE_U16_TYPE && tree != &AST_TREE_I32_TYPE && - tree != &AST_TREE_U32_TYPE && tree != &AST_TREE_I64_TYPE && - tree != &AST_TREE_U64_TYPE && + return tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_TYPE_ANY_TYPE && + tree != &AST_TREE_VOID_TYPE && tree != &AST_TREE_BOOL_TYPE && + tree != &AST_TREE_I8_TYPE && tree != &AST_TREE_U8_TYPE && + tree != &AST_TREE_I16_TYPE && tree != &AST_TREE_U16_TYPE && + tree != &AST_TREE_I32_TYPE && tree != &AST_TREE_U32_TYPE && + tree != &AST_TREE_I64_TYPE && tree != &AST_TREE_U64_TYPE && #ifdef FLOAT_16_SUPPORT tree != &AST_TREE_F16_TYPE && #endif @@ -1153,6 +1164,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], } switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_TYPE_I8: @@ -2191,6 +2203,7 @@ AstTreeRoot *makeAstRoot(const ParserNode *parsedRoot, char *filePath) { case PARSER_TOKEN_KEYWORD_WHILE: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_I8: @@ -2388,6 +2401,8 @@ AstTree *astTreeParse(const ParserNode *parserNode) { return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT); case PARSER_TOKEN_TYPE_TYPE: return &AST_TREE_TYPE_TYPE; + case PARSER_TOKEN_TYPE_ANY_TYPE: + return &AST_TREE_TYPE_ANY_TYPE; case PARSER_TOKEN_TYPE_FUNCTION: return astTreeParseTypeFunction(parserNode); case PARSER_TOKEN_TYPE_VOID: @@ -2654,6 +2669,7 @@ AstTree *astTreeParseFunction(const ParserNode *parserNode) { case PARSER_TOKEN_VALUE_CHAR: case PARSER_TOKEN_VALUE_STRING: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_I8: @@ -3268,6 +3284,7 @@ AstTree *astTreeParseCurlyBracket(const ParserNode *parserNode) { case PARSER_TOKEN_VALUE_CHAR: case PARSER_TOKEN_VALUE_STRING: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_I8: @@ -3555,7 +3572,8 @@ bool isFunction(AstTree *value) { bool isShapeShifter(AstTreeFunction *function) { for (size_t i = 0; i < function->arguments.size; ++i) { - if (function->arguments.data[i]->isConst) { + if (function->arguments.data[i]->isConst || + function->arguments.data[i]->type == &AST_TREE_TYPE_ANY_TYPE) { return true; } } @@ -3596,6 +3614,7 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT: case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: @@ -3738,6 +3757,7 @@ bool isConst(AstTree *tree) { AstTree *makeTypeOf(AstTree *value) { switch (value->token) { case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: @@ -3983,6 +4003,10 @@ bool typeIsEqual(AstTree *type0, AstTree *type1) { } bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { + if (type0->token == AST_TREE_TOKEN_TYPE_ANY_TYPE || + type1->token == AST_TREE_TOKEN_TYPE_ANY_TYPE) { + return true; + } switch (type0->token) { case AST_TREE_TOKEN_BUILTIN_CAST: case AST_TREE_TOKEN_BUILTIN_TYPE_OF: @@ -4066,6 +4090,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT: return false; case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: case AST_TREE_TOKEN_TYPE_U8: @@ -4211,6 +4236,7 @@ AstTree *getValue(AstTree *tree, bool copy) { case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: case AST_TREE_TOKEN_TYPE_U8: @@ -4379,6 +4405,7 @@ bool isIntType(AstTree *type) { case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_ARRAY: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: #ifdef FLOAT_16_SUPPORT case AST_TREE_TOKEN_TYPE_F16: @@ -4500,6 +4527,7 @@ bool isFloatType(AstTree *type) { case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_ARRAY: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_NAMESPACE: @@ -4565,6 +4593,7 @@ bool isEqual(AstTree *left, AstTree *right) { } switch (left->token) { case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_I8: case AST_TREE_TOKEN_TYPE_U8: @@ -4881,6 +4910,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, } switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_TYPE_I8: @@ -5581,6 +5611,9 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) { if (arg->isConst) { arg->value = getValue(param.value, true); } + if (arg->type == &AST_TREE_TYPE_ANY_TYPE) { + arg->type = copyAstTree(param.value->type); + } initedArguments[j] = param; goto END_OF_NAMED_FOR1; } @@ -5601,6 +5634,9 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) { if (arg->isConst) { arg->value = getValue(param.value, true); } + if (arg->type == &AST_TREE_TYPE_ANY_TYPE) { + arg->type = copyAstTree(param.value->type); + } initedArguments[j] = param; goto END_OF_UNNAMED_FOR1; } @@ -5634,19 +5670,24 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) { continue; for (size_t i = 0; i < metadata->parameters_size; ++i) { - if (!shapeShifter->function->arguments.data[i]->isConst) - continue; - AstTreeFunctionCallParam p0 = metadata->parameters[i]; AstTreeFunctionCallParam p1 = call->parameters[i]; - AstTree *v0 = getValue(p0.value, true); - AstTree *v1 = getValue(p1.value, true); - bool res = isEqual(v0, v1); - astTreeDelete(v0); - astTreeDelete(v1); - if (!res) { + if (!typeIsEqual(p0.value->type, p1.value->type)) { goto SEARCH_LOOP_CONTINUE; } + if (shapeShifter->function->arguments.data[i]->isConst) { + AstTree *v0 = getValue(p0.value, true); + AstTree *v1 = getValue(p1.value, true); + + bool res = isEqual(v0, v1); + + astTreeDelete(v0); + astTreeDelete(v1); + + if (!res) { + goto SEARCH_LOOP_CONTINUE; + } + } } element_index = i; astTreeFunctionDestroy(*newFunction); @@ -6789,6 +6830,7 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_ARRAY: case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_NAMESPACE: @@ -7808,6 +7850,7 @@ size_t getSizeOfType(AstTree *type) { case AST_TREE_TOKEN_TYPE_F32: return 4; case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 63e24b0..904d6f7 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -49,6 +49,7 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_TYPE_ARRAY, AST_TREE_TOKEN_TYPE_TYPE, AST_TREE_TOKEN_STATIC_VARS_BEGIN = AST_TREE_TOKEN_TYPE_TYPE, + AST_TREE_TOKEN_TYPE_ANY_TYPE, AST_TREE_TOKEN_TYPE_VOID, AST_TREE_TOKEN_TYPE_I8, AST_TREE_TOKEN_TYPE_U8, @@ -136,6 +137,7 @@ typedef struct AstTree { } AstTree; extern AstTree AST_TREE_TYPE_TYPE; +extern AstTree AST_TREE_TYPE_ANY_TYPE; extern AstTree AST_TREE_VOID_TYPE; extern AstTree AST_TREE_BOOL_TYPE; extern AstTree AST_TREE_I8_TYPE; diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index f79868a..08ecc6e 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -40,6 +40,7 @@ const char *LEXER_TOKEN_STRINGS[] = { "LEXER_TOKEN_BUILTIN_SHIFT_LEFT", "LEXER_TOKEN_BUILTIN_SHIFT_RIGHT", "LEXER_TOKEN_KEYWORD_TYPE", + "LEXER_TOKEN_KEYWORD_ANY_TYPE", "LEXER_TOKEN_KEYWORD_VOID", "LEXER_TOKEN_KEYWORD_I8", "LEXER_TOKEN_KEYWORD_U8", @@ -188,9 +189,9 @@ static const size_t LEXER_SYMBOL_SIZE = sizeof(LEXER_SYMBOL_TOKENS) / sizeof(*LEXER_SYMBOL_TOKENS); static const char *LEXER_KEYWORD_STRINGS[] = { - "type", "void", "i8", "u8", - "i16", "u16", "i32", "u32", - "i64", "u64", + "type", "anytype", "void", "i8", + "u8", "i16", "u16", "i32", + "u32", "i64", "u64", #ifdef FLOAT_16_SUPPORT "f16", #endif @@ -202,11 +203,12 @@ static const char *LEXER_KEYWORD_STRINGS[] = { "c_library", "c_function", }; static const LexerToken LEXER_KEYWORD_TOKENS[] = { - LEXER_TOKEN_KEYWORD_TYPE, LEXER_TOKEN_KEYWORD_VOID, - LEXER_TOKEN_KEYWORD_I8, LEXER_TOKEN_KEYWORD_U8, - LEXER_TOKEN_KEYWORD_I16, LEXER_TOKEN_KEYWORD_U16, - LEXER_TOKEN_KEYWORD_I32, LEXER_TOKEN_KEYWORD_U32, - LEXER_TOKEN_KEYWORD_I64, LEXER_TOKEN_KEYWORD_U64, + LEXER_TOKEN_KEYWORD_TYPE, LEXER_TOKEN_KEYWORD_ANY_TYPE, + LEXER_TOKEN_KEYWORD_VOID, LEXER_TOKEN_KEYWORD_I8, + LEXER_TOKEN_KEYWORD_U8, LEXER_TOKEN_KEYWORD_I16, + LEXER_TOKEN_KEYWORD_U16, LEXER_TOKEN_KEYWORD_I32, + LEXER_TOKEN_KEYWORD_U32, LEXER_TOKEN_KEYWORD_I64, + LEXER_TOKEN_KEYWORD_U64, #ifdef FLOAT_16_SUPPORT LEXER_TOKEN_KEYWORD_F16, #endif @@ -465,6 +467,7 @@ lexerPushClear(LexerNodeArray *array, size_t *array_size, char const *iter, // fall through PUSH: case LEXER_TOKEN_KEYWORD_TYPE: + case LEXER_TOKEN_KEYWORD_ANY_TYPE: case LEXER_TOKEN_KEYWORD_VOID: case LEXER_TOKEN_KEYWORD_I8: case LEXER_TOKEN_KEYWORD_U8: diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index 8c2806d..f3292ae 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -42,6 +42,7 @@ typedef enum LexerToken { LEXER_TOKEN_BUILTIN_SHIFT_LEFT, LEXER_TOKEN_BUILTIN_SHIFT_RIGHT, LEXER_TOKEN_KEYWORD_TYPE, + LEXER_TOKEN_KEYWORD_ANY_TYPE, LEXER_TOKEN_KEYWORD_VOID, LEXER_TOKEN_KEYWORD_I8, LEXER_TOKEN_KEYWORD_U8, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index e90d5fb..65fd3c9 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -48,6 +48,7 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_VALUE_STRING", "PARSER_TOKEN_TYPE_TYPE", + "PARSER_TOKEN_TYPE_ANY_TYPE", "PARSER_TOKEN_TYPE_FUNCTION", "PARSER_TOKEN_TYPE_VOID", "PARSER_TOKEN_TYPE_BOOL", @@ -298,6 +299,7 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_BUILTIN_SHIFT_LEFT: case PARSER_TOKEN_BUILTIN_SHIFT_RIGHT: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_TYPE_I8: @@ -620,6 +622,7 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_BUILTIN_SHIFT_LEFT: case PARSER_TOKEN_BUILTIN_SHIFT_RIGHT: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_TYPE_I8: @@ -971,6 +974,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_BUILTIN_SHIFT_RIGHT); case LEXER_TOKEN_KEYWORD_TYPE: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_TYPE); + case LEXER_TOKEN_KEYWORD_ANY_TYPE: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_ANY_TYPE); case LEXER_TOKEN_KEYWORD_VOID: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_VOID); case LEXER_TOKEN_KEYWORD_I8: @@ -1810,6 +1815,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_VALUE_CHAR: case PARSER_TOKEN_VALUE_STRING: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: @@ -2396,6 +2402,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_KEYWORD_WHILE: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: @@ -2516,6 +2523,7 @@ bool parserIsFunction(ParserNode *node) { case PARSER_TOKEN_KEYWORD_WHILE: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: @@ -2555,6 +2563,7 @@ bool parserIsFunction(ParserNode *node) { bool isType(ParserNode *node) { switch (node->token) { case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_I8: @@ -2742,6 +2751,7 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_OPERATOR_SHIFT_RIGHT: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_TYPE: + case PARSER_TOKEN_TYPE_ANY_TYPE: case PARSER_TOKEN_TYPE_VOID: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_TYPE_I8: diff --git a/src/compiler/parser.h b/src/compiler/parser.h index dc48511..fd40078 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -45,6 +45,7 @@ typedef enum ParserToken { PARSER_TOKEN_VALUE_STRING, PARSER_TOKEN_TYPE_TYPE, + PARSER_TOKEN_TYPE_ANY_TYPE, PARSER_TOKEN_TYPE_FUNCTION, PARSER_TOKEN_TYPE_VOID, PARSER_TOKEN_TYPE_BOOL, diff --git a/src/runner/runner.c b/src/runner/runner.c index 633e202..04f26b6 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -1567,6 +1567,7 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, return ret; } case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: case AST_TREE_TOKEN_TYPE_BOOL: @@ -2197,6 +2198,7 @@ AstTree *toRawValue(AstTree *value) { case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_BUILTIN_SIZE_OF: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: @@ -2402,6 +2404,7 @@ AstTree *castTo(AstTree *tree, AstTree *to) { case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: case AST_TREE_TOKEN_NONE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_BUILTIN_SIZE_OF: case AST_TREE_TOKEN_BUILTIN_C_LIBRARY: case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: @@ -2549,6 +2552,7 @@ ffi_type *toFFIType(AstTree *type) { case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT: case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS: case AST_TREE_TOKEN_SCOPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: case AST_TREE_TOKEN_NONE: } printLog("%s", AST_TREE_TOKEN_STRINGS[type->token]); |