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

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

View File

@@ -155,7 +155,8 @@ void Parser::factor()
{ {
/* /*
Множитель описывается следующими правилами: Множитель описывается следующими правилами:
<factor> -> number | identifier | -<factor> | (<expression>) | READ <factor> -> number | identifier | -<factor> | (<expression>) | READ
| ++ identifier | -- identifier | identifier++ | identifier--
*/ */
if(see(T_NUMBER)) { if(see(T_NUMBER)) {
int value = scanner_->getIntValue(); int value = scanner_->getIntValue();
@@ -168,7 +169,29 @@ void Parser::factor()
next(); next();
codegen_->emit(LOAD, varAddress); 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) { else if(see(T_ADDOP) && scanner_->getArithmeticValue() == A_MINUS) {
next(); next();
factor(); factor();