ch8-语法制导翻译和中间代码生成.ppt
文本预览下载声明
算术表达式和赋值语句中的类型检查 【例】设 x,y 为实型,i,j 为整型,则表达式 x = y+i*j 的三地址码是: E?E1+E2的带语义检查的三地址码的语义动作 优先级 1、布尔表达式的翻译方法 讨论下述文法G[E]生成的布尔表达式:E→E∧E∣E∨E∣┐E∣(E)∣i∣i rop i 副作用的考虑 数值表示法 【例】 数值表示法 【例】根据数值表示法对布尔表达式ab ∨ cd ∧ ef 翻译为三地址代码. 采取某种优化措施 2、控制语句中布尔表达式的翻译 定义一组控制转向的四元式 【例】语句 if ab then s 分析语句 if ab ∨c then S1 else S2 语句 while E do S 语句 if ab ∨c then S1 else S2的回填描述 需要的公共变量、过程、函数 E→E(1)∨E(2)的分析 【例】表达式 A∨BD 的翻译 控制语句的文法 条件语句 if 的翻译 条件语句 if 的文法和语义子程序的设计 C→if E then 的翻译 S→CS(1) 的翻译 Tp→CS(1) else的翻译 S→TPS(2)的翻译 循环语句while的文法和语义子程序设计 W→while 的翻译 Wd→W E do 的翻译 S→Wd S(1) 的翻译 【例】 while A∨BD do if (X6) then X = X-1 else Y = X+1 三种基本控制结构的翻译 G[S]中各产生式对应的语义子程序 8.4.4 for 循环语句的翻译 改写文法 (1) F1→for i=E(1) 的翻译 (2) F2→F1 step E(2) 的翻译 (3) F3→F2 until E(3) 的翻译 (4) S→F3 do S(1) 的翻译 翻译示例 for i=1 step 10 until N do k=k+1; 8.4.4-1 开关语句 switch常见的一种中间代码形式 8.4.4-2 语句标号和转移语句的翻译 向后引用、向前引用 翻译 goto L 翻译语句 L:S 翻译goto语句时,还有两点必须注意 8.4.5 简单说明语句的翻译 最简单的说明语句的语法描述 改造文法G[D]为G‘[D]: 文法G‘[D]和相应的语义子程序 ★过程中的说明语句 (单层) 作用域信息(嵌套) 带嵌套的过程说明的说明语句的文法 需要的操作 设计两个栈 tblptr和offset 带嵌套的过程说明语句的翻译 ★ 记录中的域名 8.4.6含数组元素的赋值语句的翻译 数组的一般定义 赋值语句中数组元素的翻译 改写文法 设置如下的语义变量和函数: 含有数组元素的赋值语句的文法G[A]及相应的语义子程序(省略语义检查): 【例】对于数组 a[2,3] 即 d1=2,d2=3 数组说明的翻译 例如,数组 int A[l1:u1, l2:u2,…,ln:un]相应的内情向量见表为 8.5 递归下降语法制导的翻译 制导翻译程序 实现数组元素的地址计算时,将产生两组四元式序列: 对数组元素的引用和赋值就有如下两种不同的四元式: 变址存数:若有 T1[T]=X,则可以用四元式([]=,X,_,T1[T])表示。 变址取数:若有 X=T1[T],则可用四元式(=[],T1[T],_,X)表示。 一组计算 bap,其值存放在临时变量 T 中; 一组计算 Vap,其值存放在临时变量 T1 中,即用 T1[T]表示数组元素的地址。 程序语言中直接改变控制流程的语句是 goto L 语句; 其中 L 是源程序中的语句标号。 标号 L 在源程序中可以以两种方式出现: 定义性出现。定义性出现的语句形式为 L:S此时,带标号的语句 S 所生成的第一个四元式地址即为标号 L 的值。 引用性出现。引用性出现的语句形式为 goto L它引用 L 的值作为四元式(goto,_,_,L)中转向的目标地址。 当标号 L 定义性出现时,应将标号此时对应的四元式地址(即标号 L 的值)登录到符号表中 L 所对应的项; 当标号 L 引用性出现时,则引用符号表中该标号 L 的值。 对标号 L 的处理方法是: 如果标号的定义性出现在前而引用性出现在后,即先定值后引用(称为向后引用),则填、查符号表及将转移语句翻译成四元式很容易。 如果标号引用性出现在前而定义性出现在后(称为向前引用),则引用时不可能从符号表中获得标号 L 的值,此时只能生成有待回填的四元式(goto,_,_,0),等到向前翻译到标号 L 定义性出现时,再将标号 L 的值回填到待填的四元式中。 翻译 goto L 语句时需要查符号表,看 L 是否为定值,有以下几种情况: (1) L 已经定值,即 L.value 为符号表中所记录的 L 值,这时生成(
显示全部