diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 26 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 2 | ||||
-rw-r--r-- | src/compiler/lexer.c | 6 | ||||
-rw-r--r-- | src/compiler/lexer.h | 1 | ||||
-rw-r--r-- | src/compiler/parser.c | 9 | ||||
-rw-r--r-- | src/compiler/parser.h | 1 |
6 files changed, 41 insertions, 4 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index ac046f0..b770098 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -104,6 +104,12 @@ AstTree AST_TREE_F128_TYPE = { .type = &AST_TREE_TYPE_TYPE, }; +AstTree AST_TREE_CODE_TYPE = { + .token = AST_TREE_TOKEN_TYPE_CODE, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + AstTree AST_TREE_VOID_VALUE = { .token = AST_TREE_TOKEN_VALUE_VOID, .metadata = NULL, @@ -139,6 +145,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_TYPE_F32", "AST_TREE_TOKEN_TYPE_F64", "AST_TREE_TOKEN_TYPE_F128", + "AST_TREE_TOKEN_TYPE_CODE", "AST_TREE_TOKEN_TYPE_BOOL", "AST_TREE_TOKEN_VALUE_VOID", @@ -251,6 +258,7 @@ void astTreePrint(const AstTree *tree, int indent) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_VOID: case AST_TREE_TOKEN_VALUE_NULL: @@ -637,6 +645,7 @@ void astTreeDestroy(AstTree tree) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_UNDEFINED: @@ -881,6 +890,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_VALUE_VOID: return tree; case AST_TREE_TOKEN_VALUE_NULL: @@ -1564,6 +1574,7 @@ AstTreeRoot *makeAstRoot(ParserNode *parsedRoot, char *filePath) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_ADDRESS: @@ -1701,6 +1712,8 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return &AST_TREE_F64_TYPE; case PARSER_TOKEN_TYPE_F128: return &AST_TREE_F128_TYPE; + case PARSER_TOKEN_TYPE_CODE: + return &AST_TREE_CODE_TYPE; case PARSER_TOKEN_TYPE_BOOL: return &AST_TREE_BOOL_TYPE; case PARSER_TOKEN_FUNCTION_CALL: @@ -1941,6 +1954,7 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: @@ -2523,6 +2537,7 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode, case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_KEYWORD_PUTC: case PARSER_TOKEN_KEYWORD_RETURN: @@ -2786,6 +2801,7 @@ bool isConst(AstTree *tree) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_UNDEFINED: @@ -2900,6 +2916,7 @@ bool isConstByValue(AstTree *tree) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_UNDEFINED: @@ -3010,6 +3027,7 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_OPERATOR_POINTER: case AST_TREE_TOKEN_KEYWORD_STRUCT: @@ -3208,6 +3226,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: return type1->token == type0->token; case AST_TREE_TOKEN_OPERATOR_POINTER: { if (type1->token != type0->token) { @@ -3312,6 +3331,7 @@ AstTree *getValue(AstTree *tree) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_NULL: case AST_TREE_TOKEN_VALUE_UNDEFINED: @@ -3412,6 +3432,7 @@ bool isIntType(AstTree *type) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_VOID: case AST_TREE_TOKEN_FUNCTION_CALL: @@ -3471,6 +3492,7 @@ bool isEqual(AstTree *left, AstTree *right) { case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_TYPE_BOOL: case AST_TREE_TOKEN_VALUE_VOID: case AST_TREE_TOKEN_VALUE_NULL: @@ -3648,6 +3670,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, case AST_TREE_TOKEN_TYPE_F32: case AST_TREE_TOKEN_TYPE_F64: case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: case AST_TREE_TOKEN_VALUE_VOID: return true; case AST_TREE_TOKEN_VALUE_BOOL: @@ -4867,8 +4890,7 @@ bool setTypesBuiltin(AstTree *tree, AstTreeSetTypesHelper helper, type_metadata->arguments = a404m_malloc( type_metadata->arguments_size * sizeof(*type_metadata->arguments)); - // TODO: change - type_metadata->returnType = copyAstTree(&AST_TREE_TYPE_TYPE); + type_metadata->returnType = copyAstTree(&AST_TREE_CODE_TYPE); type_metadata->arguments[0] = (AstTreeTypeFunctionArgument){ .type = copyAstTree(file->type), diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index b1cd722..d60088d 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -35,6 +35,7 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_TYPE_F32, AST_TREE_TOKEN_TYPE_F64, AST_TREE_TOKEN_TYPE_F128, + AST_TREE_TOKEN_TYPE_CODE, AST_TREE_TOKEN_TYPE_BOOL, AST_TREE_TOKEN_VALUE_VOID, AST_TREE_TOKEN_STATIC_VARS_END = AST_TREE_TOKEN_VALUE_VOID, @@ -104,6 +105,7 @@ extern AstTree AST_TREE_F16_TYPE; extern AstTree AST_TREE_F32_TYPE; extern AstTree AST_TREE_F64_TYPE; extern AstTree AST_TREE_F128_TYPE; +extern AstTree AST_TREE_CODE_TYPE; extern AstTree AST_TREE_VOID_VALUE; typedef struct AstTreeVariable { diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 754593a..273f40a 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -34,6 +34,7 @@ const char *LEXER_TOKEN_STRINGS[] = { "LEXER_TOKEN_KEYWORD_TRUE", "LEXER_TOKEN_KEYWORD_FALSE", "LEXER_TOKEN_KEYWORD_NULL", + "LEXER_TOKEN_KEYWORD_CODE", "LEXER_TOKEN_NUMBER", "LEXER_TOKEN_CHAR", "LEXER_TOKEN_STRING", @@ -148,7 +149,7 @@ const char *LEXER_KEYWORD_STRINGS[] = { "f16", #endif "f32", "f64", "f128", "bool", "putc", "return", "true", "false", - "if", "else", "while", "comptime", "null", "struct", "undefined", + "if", "else", "while", "comptime", "null", "struct", "undefined", "code", }; const LexerToken LEXER_KEYWORD_TOKENS[] = { LEXER_TOKEN_KEYWORD_TYPE, LEXER_TOKEN_KEYWORD_VOID, @@ -166,7 +167,7 @@ const LexerToken LEXER_KEYWORD_TOKENS[] = { LEXER_TOKEN_KEYWORD_IF, LEXER_TOKEN_KEYWORD_ELSE, LEXER_TOKEN_KEYWORD_WHILE, LEXER_TOKEN_KEYWORD_COMPTIME, LEXER_TOKEN_KEYWORD_NULL, LEXER_TOKEN_KEYWORD_STRUCT, - LEXER_TOKEN_KEYWORD_UNDEFINED, + LEXER_TOKEN_KEYWORD_UNDEFINED, LEXER_TOKEN_KEYWORD_CODE, }; const size_t LEXER_KEYWORD_SIZE = sizeof(LEXER_KEYWORD_TOKENS) / sizeof(*LEXER_KEYWORD_TOKENS); @@ -357,6 +358,7 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, case LEXER_TOKEN_KEYWORD_NULL: case LEXER_TOKEN_KEYWORD_STRUCT: case LEXER_TOKEN_KEYWORD_UNDEFINED: + case LEXER_TOKEN_KEYWORD_CODE: case LEXER_TOKEN_NUMBER: case LEXER_TOKEN_CHAR: case LEXER_TOKEN_STRING: diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index a9b6dcd..71d9640 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -33,6 +33,7 @@ typedef enum LexerToken { LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_KEYWORD_NULL, + LEXER_TOKEN_KEYWORD_CODE, LEXER_TOKEN_NUMBER, LEXER_TOKEN_CHAR, LEXER_TOKEN_STRING, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index f0d3e9b..956b834 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -40,6 +40,7 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_TYPE_F32", "PARSER_TOKEN_TYPE_F64", "PARSER_TOKEN_TYPE_F128", + "PARSER_TOKEN_TYPE_CODE", "PARSER_TOKEN_KEYWORD_PUTC", "PARSER_TOKEN_KEYWORD_RETURN", @@ -239,6 +240,7 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: goto RETURN_SUCCESS; @@ -521,6 +523,7 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: goto RETURN_SUCCESS; @@ -799,6 +802,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F64); case LEXER_TOKEN_KEYWORD_F128: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F128); + case LEXER_TOKEN_KEYWORD_CODE: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_CODE); case LEXER_TOKEN_KEYWORD_NULL: return parserNoMetadata(node, parent, PARSER_TOKEN_KEYWORD_NULL); case LEXER_TOKEN_KEYWORD_UNDEFINED: @@ -1520,6 +1525,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: case PARSER_TOKEN_KEYWORD_PUTC: @@ -2018,6 +2024,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: case PARSER_TOKEN_KEYWORD_STRUCT: @@ -2051,6 +2058,7 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_BUILTIN: @@ -2166,6 +2174,7 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_TYPE_CODE: case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_UNDEFINED: case PARSER_TOKEN_KEYWORD_IF: diff --git a/src/compiler/parser.h b/src/compiler/parser.h index ecc6159..25e9a21 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -35,6 +35,7 @@ typedef enum ParserToken { PARSER_TOKEN_TYPE_F32, PARSER_TOKEN_TYPE_F64, PARSER_TOKEN_TYPE_F128, + PARSER_TOKEN_TYPE_CODE, PARSER_TOKEN_KEYWORD_PUTC, PARSER_TOKEN_KEYWORD_RETURN, |