回溯到 FOR 循环的控制流

Backpatch to flow-of-control of FOR LOOP

我正在寻找 FOR-LOOP 中的 Backpatching。

我知道 IF-THEN-ELSE 的方法是这样的:

IF '(' expr M ')' stmt N ELSE L stmt L
{
   backpatch(,  - );
   backpatch(,  - );
}

您可以在回答中使用这些标记:

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

请解释你的答案。

FOR '(' expr1 ';' L1 expr2 ';' L2 expr3 N1 ')' L3 stmt N2 我们会有这样的场景:

backpatch(  ,  -  );
backpatch(  ,  -  ); 
backpatchlist( .truelist ,  );
backpatchlist( .falselist , pc );
  1. 第一行:当我们在循环结束时(N2),我们必须跳转到循环增量部分的第一个(L2)来计算expr3
  2. 第二行:计算 expr3 后,必须跳转到测试表达式部分的第一个 expr2
  3. 第三行:如果 expr2 的计算结果为真,则跳转到 LOOP 的第一个 Body (L3) 计算 stmt.
  4. 第四行:如果expr2的计算结果为假,则循环处理结束,我们必须跳转到pc.
  5. 可访问的LOOP之后的第一条指令

在这种情况下,标记必须定义为:

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

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

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