From 577c6b4339b7ddc5af011ca06ccae97459f5ec76 Mon Sep 17 00:00:00 2001 From: Mel Date: Sat, 24 May 2025 14:08:39 +0200 Subject: Correctly interpret all assignment operator expression variations Signed-off-by: Mel --- boot/tree.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 125 insertions(+), 19 deletions(-) (limited to 'boot/tree.c') 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"; } -- cgit 1.4.1