返回到FOR LOOP的流量控制

时间:2018-05-06 15:57:25

标签: compiler-construction bison intermediate-language

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

我知道这种方法在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 :(得分:1)

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. 第一行:当我们在LOOP(N2)结束时,我们必须跳到循环的增量部分的第一个(L2)来计算expr3
  2. 第二行:计算expr3后,必须跳转到“测试表达式”部分的第一部分expr2
  3. 第三行:如果对expr2的评估为真,请跳至LOOP&#39}的身体(L3)中的第一个来计算stmt
  4. 第四行:如果expr2的评估为假,则处理循环已经完成,我们必须在LOOP之后跳转第一条指令,pc可以访问。
  5. 在这种情况下,标记必须定义为:

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