From 6d69f846f4264e94d069d7a2bb7ab9697a508d43 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 30 Mar 2026 13:33:16 +0300 Subject: [PATCH] Add compound assignment operators --- libs/parser/rules/pslang.l | 7 +++++++ libs/parser/rules/pslang.y | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/libs/parser/rules/pslang.l b/libs/parser/rules/pslang.l index 074249a..8576412 100644 --- a/libs/parser/rules/pslang.l +++ b/libs/parser/rules/pslang.l @@ -63,6 +63,13 @@ f64 { return bp::make_f64(ctx.location); } ")" { return bp::make_rparen(ctx.location); } "[" { return bp::make_lbracket(ctx.location); } "]" { return bp::make_rbracket(ctx.location); } +"+=" { return bp::make_plus_assignment(ctx.location); } +"-=" { return bp::make_minus_assignment(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_right_shift_assignment(ctx.location); } +"<<=" { return bp::make_left_shift_assignment(ctx.location); } "+" { return bp::make_plus(ctx.location); } "-" { return bp::make_minus(ctx.location); } "*" { return bp::make_asterisk(ctx.location); } diff --git a/libs/parser/rules/pslang.y b/libs/parser/rules/pslang.y index 687b513..c54e799 100644 --- a/libs/parser/rules/pslang.y +++ b/libs/parser/rules/pslang.y @@ -105,6 +105,13 @@ template %token less_equals "<=" %token greater_equals ">=" %token arrow "->" +%token plus_assignment "+=" +%token minus_assignment "-=" +%token asterisk_assignment "*=" +%token slash_assignment "/=" +%token percent_assignment "%=" +%token left_shift_assignment "<<=" +%token right_shift_assignment ">>=" %token lit_i8 %token lit_u8 @@ -222,6 +229,13 @@ optional_comment statement : expression { $$ = std::make_unique($1); } | expression assignment expression { $$ = ast::assignment{ std::make_unique($1), std::make_unique($3), @$ }; } +| expression plus_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::addition, lhs, std::make_unique($3), @$ }), @$ }; } +| expression minus_assignment expression { auto lhs = std::make_shared($1); $$ = ast::assignment{ lhs, std::make_shared(ast::binary_operation{ ast::binary_operation_type::subtraction, lhs, std::make_unique($3), @$ }), @$ }; } +| 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 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; } | if expression colon { $$ = ast::if_block{std::make_unique($2), @$}; } | else colon { $$ = ast::else_block{@$}; }