diff options
| author | Mel <mel@rnrd.eu> | 2025-05-24 14:08:39 +0200 |
|---|---|---|
| committer | Mel <mel@rnrd.eu> | 2025-05-24 14:08:39 +0200 |
| commit | 577c6b4339b7ddc5af011ca06ccae97459f5ec76 (patch) | |
| tree | db2d795b4f6f5ad42939469037dcd872d5a82054 /boot/tree.c | |
| parent | 262592dfd2dcf74f4349cf0b58969f7b977a195c (diff) | |
| download | catskill-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.c | 144 |
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"; } |
