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();