第七章中间代码生成序71中间语言72说明语句73赋值语内容摘要:

个 statement)。 18 switch语句的目标代码结构: 对 expression求值并置于 t的有关代码 goto test L1: 有关 statement1的代码 goto next L2: 有关 statement2的代码 goto next …………………………………… Ln1: 有关 statement n1的代码 goto next Ln: 有关 statementn的代码 goto next 19 (接上页) test : if t= value1 goto L1 if t= value2 goto L2 ……………………. if t= valuen1goto Ln1 goto Ln next: expression: 选择器,将被计算出一个值。 valueE1,valueE2,… , value n1: 表达式可能取的 值。 default: “缺席值”。 用来在 expression的值不等 于任何 value i时来匹配 expression。 20 回填 两遍扫描 : • 从给定的输入构造出一棵语法树; • 对语法树按深度优先遍历,来进行定义中给出的翻译。 一遍扫描 : • 先产生暂时没有填写目标标号的转移指令。 • 对于每一条这样的指令作适当的记录, • 一旦目标标号被确定下来,再将它“ 回填 ”到相应的指令中。 21 使用回填翻译布尔表达式 布尔表达式文法 : ( 1) E→E1 or M E2 ( 2) |E1 and M E2 ( 3) |not E1 ( 4) |(E1) ( 5) |id1 relop id2 ( 6) |true ( 7) |false ( 8) M→ε 插入非终结符号 M是为了引入一个语义动作,以便在适当的时候获得即将产生的下一个四元式的索引,或说四元式的标号 22 翻译模式用到如下三个函数: 1. makelist(i): 创建一个仅包含 i的新表, i 是四元式数组的一个索引(下标),或说 i是四元式代码序列的一个标号。 2. merge(p1, p2): 连接由指针 p1和 p2指向 的两个表并且返回一个指向连接后的表的 指针。 3. backpatch( p, i): 把 i作为目标标号回 填到 p所指向的表中的每一个转移指令中 去。 此处的“表”都是为“反填”所拉的链 23 图 使用一遍扫描的布尔表达式的翻译模式 EE1 OR ME2 {backpatch(,)。 :=merge(,)。 := } EE1 AND ME2 {backpatch(,)。 :=。 :=merge(,)。 } 24 Enot E1 { :=。 := } E ( E ) {:=。 :=} E id1 relop id2 {:= makelist(nextquad)。 := makelist(nextquad+1)。 emit(180。 if180。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。