Инкремент и декремент в компиляторе
This commit is contained in:
@@ -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,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();
|
||||
|
||||
Reference in New Issue
Block a user