From e5730816475b2517421b7dfb5766f5e2d89dddd9 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 31 Mar 2026 16:00:23 +0300 Subject: [PATCH] Add logical-compound-assigment operators (^=, &=, |=) --- libs/parser/rules/pslang.l | 3 +++ libs/parser/rules/pslang.y | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/libs/parser/rules/pslang.l b/libs/parser/rules/pslang.l index 8576412..481a43d 100644 --- a/libs/parser/rules/pslang.l +++ b/libs/parser/rules/pslang.l @@ -68,6 +68,9 @@ f64 { return bp::make_f64(ctx.location); } "*=" { return bp::make_asterisk_assignment(ctx.location); } "/=" { return bp::make_slash_assignment(ctx.location); } "%=" { return bp::make_percent_assignment(ctx.location); } +"^=" { return bp::make_circumflex_assignment(ctx.location); } +"&=" { return bp::make_ampersand_assignment(ctx.location); } +"|=" { return bp::make_vertical_bar_assignment(ctx.location); } ">>=" { return bp::make_right_shift_assignment(ctx.location); } "<<=" { return bp::make_left_shift_assignment(ctx.location); } "+" { return bp::make_plus(ctx.location); } diff --git a/libs/parser/rules/pslang.y b/libs/parser/rules/pslang.y index c54e799..dd06d2c 100644 --- a/libs/parser/rules/pslang.y +++ b/libs/parser/rules/pslang.y @@ -110,6 +110,9 @@ template %token asterisk_assignment "*=" %token slash_assignment "/=" %token percent_assignment "%=" +%token circumflex_assignment "^=" +%token ampersand_assignment "&=" +%token vertical_bar_assignment "|=" %token left_shift_assignment "<<=" %token right_shift_assignment ">>=" @@ -234,6 +237,9 @@ statement | expression asterisk_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::multiplication, lhs, std::make_unique($3), @$ }), @$ }; } | expression slash_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::division, lhs, std::make_unique($3), @$ }), @$ }; } | expression percent_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::remainder, lhs, std::make_unique($3), @$ }), @$ }; } +| expression circumflex_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::logical_xor, lhs, std::make_unique($3), @$ }), @$ }; } +| expression ampersand_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::binary_and, lhs, std::make_unique($3), @$ }), @$ }; } +| expression vertical_bar_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::binary_or, lhs, std::make_unique($3), @$ }), @$ }; } | expression left_shift_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::left_shift, lhs, std::make_unique($3), @$ }), @$ }; } | expression right_shift_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::right_shift, lhs, std::make_unique($3), @$ }), @$ }; } | variable_declaration { $$ = $1; }