summaryrefslogtreecommitdiff
path: root/src/compiler/parser.c
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/parser.c
parent0ff9508bb0ea7193b0101c3cd9b4ae594e44fd02 (diff)
add i8 u8 i16 u16 i32 u32
add overflow warning
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r--src/compiler/parser.c72
1 files changed, 65 insertions, 7 deletions
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: