美文网首页
编译器笔记35-中间代码生成-控制流语句的回填

编译器笔记35-中间代码生成-控制流语句的回填

作者: 衣忌破 | 来源:发表于2020-03-07 22:01 被阅读0次
控制流语句的回填
  • 文法
文法.png
  • 综合属性

S.nextlist:指向一个包含跳转指令的列表,这些指令最终获得的目标标号就是按照运行顺序紧跟在S代码之后的指令的标号。

S → if B then S1
S → if B then S1.png

B.truelist中的所有指令要跳转到B的真出口,也就是S1的第一条指令。

B.falselist中的指令要跳转到假出口,当B为假的时候我们要跳出if语句,执行S之后的第一条指令。因此B.falselist中的所有指令都放到S.nextlist中。

S1.nextlist中的所有指令都要跳转到S1之后的第一条指令。当S1执行完毕之后整个S语句就执行完毕,接下来要执行S之后的第一条指令,因此S1.nextlist中的所有指令要放入到S.nextlist中。

根据示意图在分析S1之前,我们需要用S1的第一条语句的标号来回填B.truelist中的各条指令。因此我们需要记录下S1的第一条指令的标号,为此在S1之前设置标志非终结符M。M.quad就等于S1的第一条指令的标号。

接下来我们编写此产生式的语义动作。用M.quad来回填B.truelist中的各条指令。接着我们来计算S的综合属性S.nextlist,根据示意图可以看出S.nextlist是由B.falselist和S1.nextlist合并而成,因此我们调用merge喊出来合并这两个列表。

S → if B then S1 else S2
S → if B then S1 else S2.png
S → while B do S1
S → while B do S1.png
S → S1S2
S → S1S2.png
S → id = E ; | L = E
S → id = E ; | L = E.png
例子
例子.png 例子.png 例子.png

相关文章

网友评论

      本文标题:编译器笔记35-中间代码生成-控制流语句的回填

      本文链接:https://www.haomeiwen.com/subject/oeghdhtx.html