Инкремент и декремент в компиляторе

This commit is contained in:
2025-05-28 12:26:04 +03:00
parent 35cf9b5ed4
commit fdd30a8854

View File

@@ -156,6 +156,7 @@ void Parser::factor()
/*
Множитель описывается следующими правилами:
<factor> -> number | identifier | -<factor> | (<expression>) | READ
| ++ identifier | -- identifier | identifier++ | identifier--
*/
if(see(T_NUMBER)) {
int value = scanner_->getIntValue();
@@ -168,6 +169,28 @@ 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();