控制流语句的回填
- 文法

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

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 → while B do S1

S → S1S2

S → id = E ; | L = E

例子



网友评论