diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-02-13 18:39:08 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-02-13 18:40:23 +0330 |
commit | cb6eaf13c3b3b58779a18255177589d8d5fbf85b (patch) | |
tree | 40e648d02dc450bdda7bd4e31503b76ab4bf0a69 /src/compiler | |
parent | 0ff9508bb0ea7193b0101c3cd9b4ae594e44fd02 (diff) |
add i8 u8 i16 u16 i32 u32
add overflow warning
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/ast-tree.c | 198 | ||||
-rw-r--r-- | src/compiler/ast-tree.h | 16 | ||||
-rw-r--r-- | src/compiler/lexer.c | 18 | ||||
-rw-r--r-- | src/compiler/lexer.h | 6 | ||||
-rw-r--r-- | src/compiler/parser.c | 72 | ||||
-rw-r--r-- | src/compiler/parser.h | 8 |
6 files changed, 301 insertions, 17 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 3e01b0b..df00517 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -3,6 +3,7 @@ #include "compiler/parser.h" #include "utils/log.h" #include "utils/memory.h" +#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -25,6 +26,42 @@ AstTree AST_TREE_BOOL_TYPE = { .type = &AST_TREE_TYPE_TYPE, }; +AstTree AST_TREE_I8_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I8, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U8_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U8, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_I16_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I16, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U16_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U16, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_I32_TYPE = { + .token = AST_TREE_TOKEN_TYPE_I32, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + +AstTree AST_TREE_U32_TYPE = { + .token = AST_TREE_TOKEN_TYPE_U32, + .metadata = NULL, + .type = &AST_TREE_TYPE_TYPE, +}; + AstTree AST_TREE_I64_TYPE = { .token = AST_TREE_TOKEN_TYPE_I64, .metadata = NULL, @@ -49,9 +86,16 @@ const char *AST_TREE_TOKEN_STRINGS[] = { "AST_TREE_TOKEN_KEYWORD_PRINT_U64", "AST_TREE_TOKEN_KEYWORD_RETURN", - "AST_TREE_TOKEN_TYPE_TYPE", "AST_TREE_TOKEN_TYPE_FUNCTION", + "AST_TREE_TOKEN_TYPE_TYPE", "AST_TREE_TOKEN_TYPE_VOID", + "AST_TREE_TOKEN_TYPE_I8", + "AST_TREE_TOKEN_TYPE_U8", + "AST_TREE_TOKEN_TYPE_I16", + "AST_TREE_TOKEN_TYPE_U16", + "AST_TREE_TOKEN_TYPE_I32", + "AST_TREE_TOKEN_TYPE_U32", + "AST_TREE_TOKEN_TYPE_I64", "AST_TREE_TOKEN_TYPE_U64", "AST_TREE_TOKEN_TYPE_BOOL", @@ -116,6 +160,12 @@ void astTreePrint(const AstTree *tree, int indent) { goto RETURN_SUCCESS; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -307,6 +357,12 @@ void astTreeDestroy(AstTree tree) { return; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -416,9 +472,8 @@ void astTreeVariableDelete(AstTreeVariable *variable) { } void astTreeDelete(AstTree *tree) { - if (tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_VOID_TYPE && - tree != &AST_TREE_I64_TYPE && tree != &AST_TREE_U64_TYPE && - tree != &AST_TREE_BOOL_TYPE && tree != &AST_TREE_VOID_VALUE) { + if (AST_TREE_TOKEN_STATIC_VARS_BEGIN > tree->token || + tree->token > AST_TREE_TOKEN_STATIC_VARS_END) { astTreeDestroy(*tree); free(tree); } @@ -447,6 +502,12 @@ AstTree *copyAstTree(AstTree *tree) { switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -661,7 +722,6 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { switch (node_metadata->value->token) { case PARSER_TOKEN_VALUE_BOOL: - case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_VALUE_INT: case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_FUNCTION_CALL: @@ -687,6 +747,13 @@ AstTreeRoot *makeAstTree(ParserNode *parsedRoot) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: + case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: case PARSER_TOKEN_KEYWORD_PRINT_U64: @@ -817,6 +884,18 @@ AstTree *astTreeParse(ParserNode *parserNode, AstTreeHelper *helper) { return astTreeParseTypeFunction(parserNode, helper); case PARSER_TOKEN_TYPE_VOID: return &AST_TREE_VOID_TYPE; + case PARSER_TOKEN_TYPE_I8: + return &AST_TREE_I8_TYPE; + case PARSER_TOKEN_TYPE_U8: + return &AST_TREE_U8_TYPE; + case PARSER_TOKEN_TYPE_I16: + return &AST_TREE_I16_TYPE; + case PARSER_TOKEN_TYPE_U16: + return &AST_TREE_U16_TYPE; + case PARSER_TOKEN_TYPE_I32: + return &AST_TREE_I32_TYPE; + case PARSER_TOKEN_TYPE_U32: + return &AST_TREE_U32_TYPE; case PARSER_TOKEN_TYPE_I64: return &AST_TREE_I64_TYPE; case PARSER_TOKEN_TYPE_U64: @@ -989,6 +1068,12 @@ AstTree *astTreeParseFunction(ParserNode *parserNode, AstTreeHelper *p_helper) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1387,6 +1472,12 @@ AstTree *astTreeParseCurlyBracket(ParserNode *parserNode, case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1489,6 +1580,12 @@ AstTreeFunction *getFunction(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1523,6 +1620,12 @@ bool isConst(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1565,6 +1668,12 @@ AstTree *makeTypeOf(AstTree *value) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1661,6 +1770,12 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) { return false; case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1698,6 +1813,12 @@ bool isCircularDependencies(AstTreeHelper *helper, AstTreeVariable *variable, case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1793,6 +1914,12 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper, switch (tree->token) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -1848,6 +1975,42 @@ bool setTypesValueInt(AstTree *tree, AstTreeSetTypesHelper helper) { tree->type = &AST_TREE_I64_TYPE; } else if (helper.lookingType == &AST_TREE_U64_TYPE) { tree->type = &AST_TREE_U64_TYPE; + } else if (helper.lookingType == &AST_TREE_I32_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffff00000000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I32_TYPE; + } else if (helper.lookingType == &AST_TREE_U32_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffff00000000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U32_TYPE; + } else if (helper.lookingType == &AST_TREE_I16_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffff0000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I16_TYPE; + } else if (helper.lookingType == &AST_TREE_U16_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffff0000) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U16_TYPE; + } else if (helper.lookingType == &AST_TREE_I8_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffffff00) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_I8_TYPE; + } else if (helper.lookingType == &AST_TREE_U8_TYPE) { + AstTreeInt value = (AstTreeInt)tree->metadata; + if (value & 0xffffffffffffff00) { + printWarning(tree->str_begin, tree->str_end, "Value is overflowing"); + } + tree->type = &AST_TREE_U8_TYPE; } else { UNREACHABLE; } @@ -2118,8 +2281,14 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper, } bool setTypesAstInfix(AstTreeInfix *infix, AstTreeSetTypesHelper helper) { - return setAllTypes(&infix->left, helper, NULL) && - setAllTypes(&infix->right, helper, NULL); + if (!setAllTypes(&infix->left, helper, NULL)) { + return false; + } + AstTreeSetTypesHelper newHelper = { + .lookingType = infix->left.type, + }; + + return setAllTypes(&infix->right, newHelper, NULL); } bool astTreeCleanRoot(AstTreeRoot *root) { @@ -2142,6 +2311,12 @@ bool astTreeClean(AstTree *tree) { case AST_TREE_TOKEN_TYPE_TYPE: case AST_TREE_TOKEN_TYPE_FUNCTION: case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: case AST_TREE_TOKEN_TYPE_BOOL: @@ -2234,6 +2409,15 @@ bool astTreeCleanAstVariable(AstTreeVariable *variable) { size_t astTreeTypeSize(AstTree tree) { switch (tree.token) { + case AST_TREE_TOKEN_TYPE_I8: + case AST_TREE_TOKEN_TYPE_U8: + return 1; + case AST_TREE_TOKEN_TYPE_I16: + case AST_TREE_TOKEN_TYPE_U16: + return 2; + case AST_TREE_TOKEN_TYPE_I32: + case AST_TREE_TOKEN_TYPE_U32: + return 4; case AST_TREE_TOKEN_TYPE_I64: case AST_TREE_TOKEN_TYPE_U64: return 8; diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 921bc89..c7253a0 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -11,12 +11,20 @@ typedef enum AstTreeToken { AST_TREE_TOKEN_KEYWORD_RETURN, AST_TREE_TOKEN_KEYWORD_IF, - AST_TREE_TOKEN_TYPE_TYPE, AST_TREE_TOKEN_TYPE_FUNCTION, + AST_TREE_TOKEN_TYPE_TYPE, + AST_TREE_TOKEN_STATIC_VARS_BEGIN = AST_TREE_TOKEN_TYPE_TYPE, AST_TREE_TOKEN_TYPE_VOID, + AST_TREE_TOKEN_TYPE_I8, + AST_TREE_TOKEN_TYPE_U8, + AST_TREE_TOKEN_TYPE_I16, + AST_TREE_TOKEN_TYPE_U16, + AST_TREE_TOKEN_TYPE_I32, + AST_TREE_TOKEN_TYPE_U32, AST_TREE_TOKEN_TYPE_I64, AST_TREE_TOKEN_TYPE_U64, AST_TREE_TOKEN_TYPE_BOOL, + AST_TREE_TOKEN_STATIC_VARS_END = AST_TREE_TOKEN_TYPE_BOOL, AST_TREE_TOKEN_FUNCTION_CALL, AST_TREE_TOKEN_VARIABLE, @@ -58,6 +66,12 @@ typedef struct AstTree { extern AstTree AST_TREE_TYPE_TYPE; extern AstTree AST_TREE_VOID_TYPE; extern AstTree AST_TREE_BOOL_TYPE; +extern AstTree AST_TREE_I8_TYPE; +extern AstTree AST_TREE_U8_TYPE; +extern AstTree AST_TREE_I16_TYPE; +extern AstTree AST_TREE_U16_TYPE; +extern AstTree AST_TREE_I32_TYPE; +extern AstTree AST_TREE_U32_TYPE; extern AstTree AST_TREE_I64_TYPE; extern AstTree AST_TREE_U64_TYPE; extern AstTree AST_TREE_VOID_VALUE; diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index 2e3090b..c740dd3 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -14,6 +14,12 @@ const char *LEXER_TOKEN_STRINGS[] = { "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_BOOL", @@ -83,11 +89,15 @@ const size_t LEXER_SYMBOL_SIZE = sizeof(LEXER_SYMBOL_TOKENS) / sizeof(*LEXER_SYMBOL_TOKENS); const char *LEXER_KEYWORD_STRINGS[] = { - "type", "void", "i64", "u64", "bool", "print_u64", + "type", "void", "i8", "u8", "i16", "u16", + "i32", "u32", "i64", "u64", "bool", "print_u64", "return", "true", "false", "if", "else", }; 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_BOOL, LEXER_TOKEN_KEYWORD_PRINT_U64, LEXER_TOKEN_KEYWORD_RETURN, LEXER_TOKEN_KEYWORD_TRUE, @@ -219,6 +229,12 @@ void lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, PUSH: case LEXER_TOKEN_KEYWORD_TYPE: case LEXER_TOKEN_KEYWORD_VOID: + case LEXER_TOKEN_KEYWORD_I8: + case LEXER_TOKEN_KEYWORD_U8: + case LEXER_TOKEN_KEYWORD_I16: + case LEXER_TOKEN_KEYWORD_U16: + case LEXER_TOKEN_KEYWORD_I32: + case LEXER_TOKEN_KEYWORD_U32: case LEXER_TOKEN_KEYWORD_I64: case LEXER_TOKEN_KEYWORD_U64: case LEXER_TOKEN_KEYWORD_BOOL: diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index f432c9d..af2e7a3 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -7,6 +7,12 @@ typedef enum LexerToken { 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_BOOL, diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 26d53fb..367c490 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -20,6 +20,13 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_TYPE_TYPE", "PARSER_TOKEN_TYPE_FUNCTION", "PARSER_TOKEN_TYPE_VOID", + "PARSER_TOKEN_TYPE_I8", + "PARSER_TOKEN_TYPE_U8", + "PARSER_TOKEN_TYPE_I16", + "PARSER_TOKEN_TYPE_U16", + "PARSER_TOKEN_TYPE_I32", + "PARSER_TOKEN_TYPE_U32", + "PARSER_TOKEN_TYPE_I64", "PARSER_TOKEN_TYPE_U64", "PARSER_TOKEN_TYPE_BOOL", @@ -64,7 +71,10 @@ static constexpr ParserOrder PARSER_ORDER[] = { .ltr = true, ORDER_ARRAY(LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS, LEXER_TOKEN_IDENTIFIER, LEXER_TOKEN_KEYWORD_TYPE, - LEXER_TOKEN_KEYWORD_VOID, LEXER_TOKEN_KEYWORD_I64, + 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_BOOL, LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, LEXER_TOKEN_NUMBER, ), @@ -148,6 +158,12 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -352,6 +368,12 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_IDENTIFIER: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -546,6 +568,18 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_TYPE); case LEXER_TOKEN_KEYWORD_VOID: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_VOID); + case LEXER_TOKEN_KEYWORD_I8: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I8); + case LEXER_TOKEN_KEYWORD_U8: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U8); + case LEXER_TOKEN_KEYWORD_I16: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I16); + case LEXER_TOKEN_KEYWORD_U16: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U16); + case LEXER_TOKEN_KEYWORD_I32: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I32); + case LEXER_TOKEN_KEYWORD_U32: + return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_U32); case LEXER_TOKEN_KEYWORD_I64: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_I64); case LEXER_TOKEN_KEYWORD_U64: @@ -990,6 +1024,12 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1008,12 +1048,12 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_OPERATOR_MULTIPLY: case PARSER_TOKEN_OPERATOR_DIVIDE: case PARSER_TOKEN_OPERATOR_MODULO: - case PARSER_TOKEN_OPERATOR_EQUAL: - case PARSER_TOKEN_OPERATOR_NOT_EQUAL: - case PARSER_TOKEN_OPERATOR_GREATER: - case PARSER_TOKEN_OPERATOR_SMALLER: - case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL: - case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: + case PARSER_TOKEN_OPERATOR_EQUAL: + case PARSER_TOKEN_OPERATOR_NOT_EQUAL: + case PARSER_TOKEN_OPERATOR_GREATER: + case PARSER_TOKEN_OPERATOR_SMALLER: + case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL: + case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case PARSER_TOKEN_FUNCTION_DEFINITION: case PARSER_TOKEN_FUNCTION_CALL: printError(bodyArray->data[i]->str_begin, bodyArray->data[i]->str_end, @@ -1319,6 +1359,12 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1336,6 +1382,12 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_FUNCTION: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: @@ -1398,6 +1450,12 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL: case PARSER_TOKEN_TYPE_TYPE: case PARSER_TOKEN_TYPE_VOID: + case PARSER_TOKEN_TYPE_I8: + case PARSER_TOKEN_TYPE_U8: + case PARSER_TOKEN_TYPE_I16: + case PARSER_TOKEN_TYPE_U16: + case PARSER_TOKEN_TYPE_I32: + case PARSER_TOKEN_TYPE_U32: case PARSER_TOKEN_TYPE_I64: case PARSER_TOKEN_TYPE_U64: case PARSER_TOKEN_TYPE_BOOL: diff --git a/src/compiler/parser.h b/src/compiler/parser.h index a5378d7..4e8c298 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -15,6 +15,12 @@ typedef enum ParserToken { PARSER_TOKEN_TYPE_TYPE, PARSER_TOKEN_TYPE_FUNCTION, PARSER_TOKEN_TYPE_VOID, + PARSER_TOKEN_TYPE_I8, + PARSER_TOKEN_TYPE_U8, + PARSER_TOKEN_TYPE_I16, + PARSER_TOKEN_TYPE_U16, + PARSER_TOKEN_TYPE_I32, + PARSER_TOKEN_TYPE_U32, PARSER_TOKEN_TYPE_I64, PARSER_TOKEN_TYPE_U64, PARSER_TOKEN_TYPE_BOOL, @@ -58,7 +64,7 @@ extern const char *PARSER_TOKEN_STRINGS[]; typedef struct ParserOrder { bool ltr; size_t size; - LexerToken data[15]; + LexerToken data[20]; } ParserOrder; typedef struct ParserNode { |