首页 文章资讯内容详情

什么是编译器设计中布尔表达式和控制语句的 Backpatching?

2026-06-02 2 花语

执行语法导向翻译的最简单方法是使用两次传递。首先,为输入构建一个语法树,然后以深度优先的顺序遍历树,完成定义中给出的翻译。

在单次传递中为布尔表达式和控制语句流生成代码的主要问题是,在单次传递期间,我们无法理解在生成跳转语句时控件应该转到的标签。它可以通过使跳转的目标暂时未定义的一系列分支语句来解决这个问题。

每个这样的语句都将被记录在goto语句的记录中,当决定正确的标签时,将在其中填写标签。它可以将标签的后续填充称为backpatching。

布尔表达式的回补

它可以构建适合在自底向上解析期间为布尔表达式生成代码的翻译方案。语法中的非终结符M导致语义动作在合适的时间拾取要创建的下一条指令的索引。语法如下-

B→B1||MB2|B1&&MB2|!B1|(B1)|E1relE2|真|假

M→ϵ

翻译方案如下-

B→B1||MB2

{backpatch(B1.falselist,M.instr);

B.truelist=合并(B1.truelist,B2.truelist);

B.falselist=B2.falselist;}

B→B1&&MB2

{backpatch(B1.truelist,M.instr);

B.truelist=B2.truelist;

B.falselist=合并(B1.falselist,B2.falselist);}

B→!B1

{B.truelist=B1.falselist;

B.falselist=B1.truelist;}

B→(B1)

{B.truelist=B1.truelist;

B.falselist=B1.falselist;}

B→E1relE2

{B.truelist=makelist(nextinstr);

B.falselist=makelist(nextinstr+1);

append(ifE1.addrrelopE2.addrgoto-);

追加(转到-);}

B→True

{B.truelist=makelist(nextinstr);

追加(转到-);}