From fdd30a8854927d365ceff6591ae62b4d00333187 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Wed, 28 May 2025 12:26:04 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=BD=D0=BA=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D0=B8=20=D0=B4=D0=B5=D0=BA=D1=80=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=20=D0=B2=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab4/cmilan/src/parser.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/lab4/cmilan/src/parser.cpp b/lab4/cmilan/src/parser.cpp index c67b27c..b2c94c9 100644 --- a/lab4/cmilan/src/parser.cpp +++ b/lab4/cmilan/src/parser.cpp @@ -155,7 +155,8 @@ void Parser::factor() { /* Множитель описывается следующими правилами: - -> number | identifier | - | () | READ + -> number | identifier | - | () | READ + | ++ identifier | -- identifier | identifier++ | identifier-- */ if(see(T_NUMBER)) { int value = scanner_->getIntValue(); @@ -168,7 +169,29 @@ void Parser::factor() next(); codegen_->emit(LOAD, varAddress); //Если встретили переменную, то выгружаем значение, лежащее по ее адресу, на вершину стека + + // Постфиксный инкремент или декремент + if(see(T_INC) || see(T_DEC)) { + codegen_->emit(DUP); + codegen_->emit(PUSH, 1); + codegen_->emit(see(T_INC) ? ADD : SUB); + codegen_->emit(STORE, varAddress); + next(); + } } + // Префиксный инкремент или декремент + else if(see(T_INC) || see(T_DEC)) { + bool isIncrement = see(T_INC); + next(); + mustBe(T_IDENTIFIER); + int varAddress = findOrAddVariable(scanner_->getStringValue()); + + codegen_->emit(LOAD, varAddress); + codegen_->emit(PUSH, 1); + codegen_->emit(isIncrement ? ADD : SUB); + codegen_->emit(DUP); + codegen_->emit(STORE, varAddress); + } else if(see(T_ADDOP) && scanner_->getArithmeticValue() == A_MINUS) { next(); factor();