about summary refs log tree commit diff
path: root/boot/tree.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-05-24 14:08:39 +0200
committerMel <mel@rnrd.eu>2025-05-24 14:08:39 +0200
commit577c6b4339b7ddc5af011ca06ccae97459f5ec76 (patch)
treedb2d795b4f6f5ad42939469037dcd872d5a82054 /boot/tree.c
parent262592dfd2dcf74f4349cf0b58969f7b977a195c (diff)
downloadcatskill-577c6b4339b7ddc5af011ca06ccae97459f5ec76.tar.zst
catskill-577c6b4339b7ddc5af011ca06ccae97459f5ec76.zip
Correctly interpret all assignment operator expression variations
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/tree.c')
-rw-r--r--boot/tree.c144
1 files changed, 125 insertions, 19 deletions
diff --git a/boot/tree.c b/boot/tree.c
index 4fb4b73..e6c5b78 100644
--- a/boot/tree.c
+++ b/boot/tree.c
@@ -18,11 +18,10 @@ unary_operation_from_token(const struct Token* token)
     switch (token->kind) {
     case TOKEN_MINUS:
         return UNARY_MINUS;
-    case TOKEN_NOT:
+    case TOKEN_BANG:
         return UNARY_NOT;
-        // TODO: tilde token
-        // case TOKEN_TILDE:
-        //    return UNARY_BITWISE_NOT;
+    case TOKEN_TILDE:
+        return UNARY_BITWISE_NOT;
 
     default:
         return UNARY_NONE;
@@ -69,6 +68,20 @@ enum Binary_Operation
     BINARY_BITWISE_XOR,
     BINARY_BITWISE_LEFT_SHIFT,
     BINARY_BITWISE_RIGHT_SHIFT,
+
+    BINARY_ASSIGN,
+    BINARY_ASSIGN_PLUS,
+    BINARY_ASSIGN_MINUS,
+    BINARY_ASSIGN_MULTIPLY,
+    BINARY_ASSIGN_DIVIDE,
+    BINARY_ASSIGN_MODULO,
+    BINARY_ASSIGN_AND,
+    BINARY_ASSIGN_OR,
+    BINARY_ASSIGN_BITWISE_AND,
+    BINARY_ASSIGN_BITWISE_OR,
+    BINARY_ASSIGN_BITWISE_XOR,
+    BINARY_ASSIGN_BITWISE_LEFT_SHIFT,
+    BINARY_ASSIGN_BITWISE_RIGHT_SHIFT,
 };
 
 enum Binary_Operation
@@ -83,9 +96,8 @@ binary_operation_from_token(const struct Token* token)
         return BINARY_MULTIPLY;
     case TOKEN_SLASH:
         return BINARY_DIVIDE;
-        // TODO: percent token
-        // case TOKEN_PERCENT:
-        // return BINARY_MODULO;
+    case TOKEN_PERCENT:
+        return BINARY_MODULO;
 
     case TOKEN_EQUAL:
         return BINARY_EQUAL;
@@ -104,6 +116,44 @@ binary_operation_from_token(const struct Token* token)
     case TOKEN_OR:
         return BINARY_OR;
 
+    case TOKEN_AMPERSAND:
+        return BINARY_BITWISE_AND;
+    case TOKEN_PIPE:
+        return BINARY_BITWISE_OR;
+    case TOKEN_CARET:
+        return BINARY_BITWISE_XOR;
+    case TOKEN_LEFT_SHIFT:
+        return BINARY_BITWISE_LEFT_SHIFT;
+    case TOKEN_RIGHT_SHIFT:
+        return BINARY_BITWISE_RIGHT_SHIFT;
+
+    case TOKEN_ASSIGN:
+        return BINARY_ASSIGN;
+    case TOKEN_ASSIGN_PLUS:
+        return BINARY_ASSIGN_PLUS;
+    case TOKEN_ASSIGN_MINUS:
+        return BINARY_ASSIGN_MINUS;
+    case TOKEN_ASSIGN_STAR:
+        return BINARY_ASSIGN_MULTIPLY;
+    case TOKEN_ASSIGN_SLASH:
+        return BINARY_ASSIGN_DIVIDE;
+    case TOKEN_ASSIGN_PERCENT:
+        return BINARY_ASSIGN_MODULO;
+    case TOKEN_ASSIGN_AND:
+        return BINARY_ASSIGN_AND;
+    case TOKEN_ASSIGN_OR:
+        return BINARY_ASSIGN_OR;
+    case TOKEN_ASSIGN_AMPERSAND:
+        return BINARY_ASSIGN_BITWISE_AND;
+    case TOKEN_ASSIGN_PIPE:
+        return BINARY_ASSIGN_BITWISE_OR;
+    case TOKEN_ASSIGN_CARET:
+        return BINARY_ASSIGN_BITWISE_XOR;
+    case TOKEN_ASSIGN_LEFT_SHIFT:
+        return BINARY_ASSIGN_BITWISE_LEFT_SHIFT;
+    case TOKEN_ASSIGN_RIGHT_SHIFT:
+        return BINARY_ASSIGN_BITWISE_RIGHT_SHIFT;
+
     default:
         return BINARY_NONE;
     }
@@ -117,34 +167,48 @@ binary_operation_precedence(enum Binary_Operation operation)
 {
     switch (operation) {
     // weakest
-    case BINARY_OR:
+    case BINARY_ASSIGN:
+    case BINARY_ASSIGN_PLUS:
+    case BINARY_ASSIGN_MINUS:
+    case BINARY_ASSIGN_MULTIPLY:
+    case BINARY_ASSIGN_DIVIDE:
+    case BINARY_ASSIGN_MODULO:
+    case BINARY_ASSIGN_AND:
+    case BINARY_ASSIGN_OR:
+    case BINARY_ASSIGN_BITWISE_AND:
+    case BINARY_ASSIGN_BITWISE_OR:
+    case BINARY_ASSIGN_BITWISE_XOR:
+    case BINARY_ASSIGN_BITWISE_LEFT_SHIFT:
+    case BINARY_ASSIGN_BITWISE_RIGHT_SHIFT:
         return 1;
-    case BINARY_AND:
+    case BINARY_OR:
         return 2;
-    case BINARY_BITWISE_OR:
+    case BINARY_AND:
         return 3;
-    case BINARY_BITWISE_XOR:
+    case BINARY_BITWISE_OR:
         return 4;
-    case BINARY_BITWISE_AND:
+    case BINARY_BITWISE_XOR:
         return 5;
+    case BINARY_BITWISE_AND:
+        return 6;
     case BINARY_EQUAL:
     case BINARY_NOT_EQUAL:
-        return 6;
+        return 7;
     case BINARY_GREATER_THAN:
     case BINARY_GREATER_THAN_EQUAL:
     case BINARY_LESS_THAN:
     case BINARY_LESS_THAN_EQUAL:
-        return 7;
+        return 8;
     case BINARY_BITWISE_LEFT_SHIFT:
     case BINARY_BITWISE_RIGHT_SHIFT:
-        return 8;
+        return 9;
     case BINARY_PLUS:
     case BINARY_MINUS:
-        return 9;
+        return 10;
     case BINARY_MULTIPLY:
     case BINARY_DIVIDE:
     case BINARY_MODULO:
-        return 10;
+        return 11;
         // strongest
 
     default:
@@ -162,8 +226,23 @@ enum Binary_Operation_Associativity
 enum Binary_Operation_Associativity
 binary_operation_associativity(enum Binary_Operation operation)
 {
-    // all operations are left associative by default.
-    return BINARY_ASSOCIATIVITY_LEFT;
+    switch (operation) {
+    case BINARY_ASSIGN:
+    case BINARY_ASSIGN_PLUS:
+    case BINARY_ASSIGN_MINUS:
+    case BINARY_ASSIGN_MULTIPLY:
+    case BINARY_ASSIGN_DIVIDE:
+    case BINARY_ASSIGN_MODULO:
+    case BINARY_ASSIGN_AND:
+    case BINARY_ASSIGN_OR:
+    case BINARY_ASSIGN_BITWISE_AND:
+    case BINARY_ASSIGN_BITWISE_OR:
+    case BINARY_ASSIGN_BITWISE_XOR:
+    case BINARY_ASSIGN_BITWISE_LEFT_SHIFT:
+        return BINARY_ASSOCIATIVITY_RIGHT;
+    default:
+        return BINARY_ASSOCIATIVITY_LEFT;
+    }
 }
 
 const ascii*
@@ -209,6 +288,33 @@ binary_operation_to_string(enum Binary_Operation operation)
     case BINARY_BITWISE_RIGHT_SHIFT:
         return ">>";
 
+    case BINARY_ASSIGN:
+        return "=";
+    case BINARY_ASSIGN_PLUS:
+        return "+=";
+    case BINARY_ASSIGN_MINUS:
+        return "-=";
+    case BINARY_ASSIGN_MULTIPLY:
+        return "*=";
+    case BINARY_ASSIGN_DIVIDE:
+        return "/=";
+    case BINARY_ASSIGN_MODULO:
+        return "%=";
+    case BINARY_ASSIGN_AND:
+        return "&&=";
+    case BINARY_ASSIGN_OR:
+        return "||=";
+    case BINARY_ASSIGN_BITWISE_AND:
+        return "&=";
+    case BINARY_ASSIGN_BITWISE_OR:
+        return "|=";
+    case BINARY_ASSIGN_BITWISE_XOR:
+        return "^=";
+    case BINARY_ASSIGN_BITWISE_LEFT_SHIFT:
+        return "<<=";
+    case BINARY_ASSIGN_BITWISE_RIGHT_SHIFT:
+        return ">>=";
+
     default:
         return "unknown";
     }