我正在寻找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
请解释你的答案。
答案 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 );
N2
)结束时,我们必须跳到循环的增量部分的第一个(L2
)来计算expr3
expr3
后,必须跳转到“测试表达式”部分的第一部分expr2
expr2
的评估为真,请跳至LOOP&#39}的身体(L3
)中的第一个来计算stmt
。expr2
的评估为假,则处理循环已经完成,我们必须在LOOP之后跳转第一条指令,pc
可以访问。在这种情况下,标记必须定义为:
L1,L2,L3 : {
$$ = pc;
}
N1 : {
emit(pop);
$$ = pc;
emit3(goto_, 0);
}
N2 : {
$$ = pc;
emit3(goto_, 0);
}