Backpatch для контроля потока FOR LOOP - PullRequest
0 голосов
/ 06 мая 2018

Я ищу Backpatching в FOR-LOOP.

Я знаю, что этот подход в IF-THEN-ELSE заключается в следующем:

IF '(' expr M ')' stmt N ELSE L stmt L
{
   backpatch($4, $9 - $4);
   backpatch($7, $11 - $7);
}

Вы можете использовать эти маркеры в своем ответе:

FOR '(' expr ';' L expr M N ';' L expr N ')' L stmt N L

Пожалуйста, объясните свой ответ.

1 Ответ

0 голосов
/ 08 мая 2018

В 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 );
  1. Первая строка: когда мы находимся в конце цикла (N2), мы должны перейти к первому разделу приращения цикла (L2), чтобы вычислить expr3
  2. Вторая строка: после вычисления expr3, необходимо перейти к первому разделу Test Expression expr2
  3. Третья строка: если оценка expr2 верна, перейдите к первому из тела LOOP (L3), чтобы вычислить stmt.
  4. Четвертая строка: если оценка expr2 ложна, обработка цикла завершена, и мы должны перейти к первой инструкции после LOOP, которая доступна для pc.

В этом состоянии маркеры должны быть определены следующим образом:

L1,L2,L3 :  { 
              $$ = pc;
            }

N1       :  {
             emit(pop);
             $$ = pc;
             emit3(goto_, 0);
            }

N2       : { 
             $$ = pc;
             emit3(goto_, 0);
           }
...