summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-13 18:39:08 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-02-13 18:40:23 +0330
commitcb6eaf13c3b3b58779a18255177589d8d5fbf85b (patch)
tree40e648d02dc450bdda7bd4e31503b76ab4bf0a69 /src/compiler
parent0ff9508bb0ea7193b0101c3cd9b4ae594e44fd02 (diff)
add i8 u8 i16 u16 i32 u32
add overflow warning
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/ast-tree.c198
-rw-r--r--src/compiler/ast-tree.h16
-rw-r--r--src/compiler/lexer.c18
-rw-r--r--src/compiler/lexer.h6
-rw-r--r--src/compiler/parser.c72
-rw-r--r--src/compiler/parser.h8
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 {