From cb6eaf13c3b3b58779a18255177589d8d5fbf85b Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Thu, 13 Feb 2025 18:39:08 +0330
Subject: add i8 u8 i16 u16 i32 u32 add overflow warning

---
 src/compiler/parser.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 65 insertions(+), 7 deletions(-)

(limited to 'src/compiler/parser.c')

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:
-- 
cgit v1.2.3