В FOR '(' expr1 ';' L1 expr2 ';' L2 expr3 N1 ')' L3 stmt N2
у нас будет такой сценарий:
backpatch( $14 , $8 - $14 );
backpatch( $10 , $5 - $10 );
backpatchlist( $6.truelist , $12 );
backpatchlist( $6.falselist , pc );
- Первая строка: когда мы находимся в конце цикла (
N2
), мы должны перейти к первому разделу приращения цикла (L2
), чтобы вычислить expr3
- Вторая строка: после вычисления
expr3
, необходимо перейти к первому разделу Test Expression expr2
- Третья строка: если оценка
expr2
верна, перейдите к первому из тела LOOP (L3
), чтобы вычислить stmt
.
- Четвертая строка: если оценка
expr2
ложна, обработка цикла завершена, и мы должны перейти к первой инструкции после LOOP, которая доступна для pc
.
В этом состоянии маркеры должны быть определены следующим образом:
L1,L2,L3 : {
$$ = pc;
}
N1 : {
emit(pop);
$$ = pc;
emit3(goto_, 0);
}
N2 : {
$$ = pc;
emit3(goto_, 0);
}