From 9b355a18b14f2ece7707e6c5334124dcc0961e2d Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Wed, 9 Apr 2025 17:52:34 +0330
Subject: add logical and or not

---
 src/compiler/parser.c | 41 ++++++++++++++++++++++++++++++++++++++---
 1 file changed, 38 insertions(+), 3 deletions(-)

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

diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 5a0d00b..cd4a45b 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -78,6 +78,9 @@ const char *PARSER_TOKEN_STRINGS[] = {
     "PARSER_TOKEN_OPERATOR_ADDRESS",
     "PARSER_TOKEN_OPERATOR_DEREFERENCE",
     "PARSER_TOKEN_OPERATOR_ACCESS",
+    "PARSER_TOKEN_OPERATOR_LOGICAL_NOT",
+    "PARSER_TOKEN_OPERATOR_LOGICAL_AND",
+    "PARSER_TOKEN_OPERATOR_LOGICAL_OR",
 
     "PARSER_TOKEN_FUNCTION_DEFINITION",
 
@@ -133,7 +136,7 @@ static const ParserOrder PARSER_ORDER[] = {
         .end = LEXER_TOKEN_ORDER9,
     },
     {
-        .ltr = false,
+        .ltr = true,
         .begin = LEXER_TOKEN_ORDER9,
         .end = LEXER_TOKEN_ORDER10,
     },
@@ -143,13 +146,18 @@ static const ParserOrder PARSER_ORDER[] = {
         .end = LEXER_TOKEN_ORDER11,
     },
     {
-        .ltr = true,
+        .ltr = false,
         .begin = LEXER_TOKEN_ORDER11,
         .end = LEXER_TOKEN_ORDER12,
     },
     {
-        .ltr = false,
+        .ltr = true,
         .begin = LEXER_TOKEN_ORDER12,
+        .end = LEXER_TOKEN_ORDER13,
+    },
+    {
+        .ltr = false,
+        .begin = LEXER_TOKEN_ORDER13,
         .end = LEXER_TOKEN_END_ORDERS,
     },
 };
@@ -247,6 +255,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
       printf(" ");
   }
     goto RETURN_SUCCESS;
+  case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
   case PARSER_TOKEN_KEYWORD_STRUCT:
   case PARSER_TOKEN_OPERATOR_POINTER:
   case PARSER_TOKEN_OPERATOR_ADDRESS:
@@ -341,6 +350,8 @@ void parserNodePrint(const ParserNode *node, int indent) {
       printf(" ");
   }
     goto RETURN_SUCCESS;
+  case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
   case PARSER_TOKEN_OPERATOR_ACCESS:
   case PARSER_TOKEN_OPERATOR_ASSIGN:
   case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
@@ -493,6 +504,7 @@ void parserNodeDelete(ParserNode *node) {
     free(metadata);
   }
     goto RETURN_SUCCESS;
+  case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
   case PARSER_TOKEN_KEYWORD_STRUCT:
   case PARSER_TOKEN_OPERATOR_POINTER:
   case PARSER_TOKEN_OPERATOR_ADDRESS:
@@ -541,6 +553,8 @@ void parserNodeDelete(ParserNode *node) {
     free(metadata);
   }
     goto RETURN_SUCCESS;
+  case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
   case PARSER_TOKEN_OPERATOR_ACCESS:
   case PARSER_TOKEN_OPERATOR_ASSIGN:
   case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
@@ -792,6 +806,15 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
   case LEXER_TOKEN_SYMBOL_ACCESS:
     return parserBinaryOperator(node, begin, end, parent,
                                 PARSER_TOKEN_OPERATOR_ACCESS);
+  case LEXER_TOKEN_SYMBOL_LOGICAL_AND:
+    return parserBinaryOperator(node, begin, end, parent,
+                                PARSER_TOKEN_OPERATOR_LOGICAL_AND);
+  case LEXER_TOKEN_SYMBOL_LOGICAL_OR:
+    return parserBinaryOperator(node, begin, end, parent,
+                                PARSER_TOKEN_OPERATOR_LOGICAL_OR);
+  case LEXER_TOKEN_SYMBOL_LOGICAL_NOT:
+    return parserLeftOperator(node, end, parent,
+                              PARSER_TOKEN_OPERATOR_LOGICAL_NOT);
   case LEXER_TOKEN_SYMBOL_PLUS: {
     ParserNode *result = parserBinaryOrLeftOperator(node, begin, end, parent,
                                                     PARSER_TOKEN_OPERATOR_PLUS,
@@ -1319,6 +1342,9 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
       case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
       case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
       case PARSER_TOKEN_FUNCTION_DEFINITION:
+      case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
+      case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+      case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
       case PARSER_TOKEN_FUNCTION_CALL:
       case PARSER_TOKEN_KEYWORD_COMPTIME:
         printError(bodyArray->data[i]->str_begin, bodyArray->data[i]->str_end,
@@ -1746,6 +1772,9 @@ bool isExpression(ParserNode *node) {
   case PARSER_TOKEN_OPERATOR_SMALLER:
   case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
   case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
   case PARSER_TOKEN_VALUE_INT:
   case PARSER_TOKEN_VALUE_FLOAT:
   case PARSER_TOKEN_VALUE_BOOL:
@@ -1850,6 +1879,9 @@ bool isType(ParserNode *node) {
   case PARSER_TOKEN_OPERATOR_SMALLER:
   case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
   case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
   case PARSER_TOKEN_KEYWORD_WHILE:
     return false;
   case PARSER_TOKEN_NONE:
@@ -1889,6 +1921,9 @@ bool isValue(ParserNode *node) {
   case PARSER_TOKEN_OPERATOR_SMALLER:
   case PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL:
   case PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_NOT:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_AND:
+  case PARSER_TOKEN_OPERATOR_LOGICAL_OR:
   case PARSER_TOKEN_TYPE_FUNCTION:
   case PARSER_TOKEN_TYPE_TYPE:
   case PARSER_TOKEN_TYPE_VOID:
-- 
cgit v1.2.3