回溯到 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 );
- 第一行:当我们在循环结束时(
N2
),我们必须跳转到循环增量部分的第一个(L2
)来计算expr3
- 第二行:计算
expr3
后,必须跳转到测试表达式部分的第一个 expr2
- 第三行:如果
expr2
的计算结果为真,则跳转到 LOOP 的第一个 Body (L3
) 计算 stmt
.
- 第四行:如果
expr2
的计算结果为假,则循环处理结束,我们必须跳转到pc
. 可访问的LOOP之后的第一条指令
在这种情况下,标记必须定义为:
L1,L2,L3 : {
$$ = pc;
}
N1 : {
emit(pop);
$$ = pc;
emit3(goto_, 0);
}
N2 : {
$$ = pc;
emit3(goto_, 0);
}
我正在寻找 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 );
- 第一行:当我们在循环结束时(
N2
),我们必须跳转到循环增量部分的第一个(L2
)来计算expr3
- 第二行:计算
expr3
后,必须跳转到测试表达式部分的第一个expr2
- 第三行:如果
expr2
的计算结果为真,则跳转到 LOOP 的第一个 Body (L3
) 计算stmt
. - 第四行:如果
expr2
的计算结果为假,则循环处理结束,我们必须跳转到pc
. 可访问的LOOP之后的第一条指令
在这种情况下,标记必须定义为:
L1,L2,L3 : {
$$ = pc;
}
N1 : {
emit(pop);
$$ = pc;
emit3(goto_, 0);
}
N2 : {
$$ = pc;
emit3(goto_, 0);
}