语义分析与中间代码生成-编译原理-07-(一)
《编译原理》(Principles of Compiling) 上次课主要内容——语法制导翻译 完成语法翻译的目的 实现高级语言源程序到目标语言程序的等价变化 源语句的结构与目标代码结构的对应 做法 E→E1 + E2 E.val:=E1.val+E2.val 依据产生式设计语义处理子程序——语法制导翻译 一种实现——属性文法 A=(G, V, F) 用属性表示一些语义值 上次课主要内容——属性计算与分类 继承属性 A→X1X2…Xn Xi.in=f(c,c1,c2,…,ck) 1≤ki≤n 上次课主要内容——属性计算与分类 综合属性 A→X1X2…Xn A.s=f(c1,c2,…,ck) 上次课主要内容 属性的计算时机 综合属性值——在归约时进行计算 是其“后代”的综合结果,所以在处理完成后获得 继承属性值——在派生时进行计算 变量的继承属性用于该变量的相关处理,所以通常在处理此变量前完成计算 固有属性值——单词属性(值)在词法分析时完成 上次课主要内容——S-属性定义 只含综合属性的属性文法,又称为S-属性文法 产生式 属性(计算)规则/语义规则 E → E1 + E2 E.val := E1.val + E2.val E → E1 * E2 E.val := E1.val * E2.val E →(E1) E.val := E1.val E →id E.val := id .val 上次课主要内容——L-属性定义 包含综合属性和继承属性的属性文法,又叫L-属性文法 D → T L L.in := T.type T → int T.type := integer T → real T.type := real L → L1 ,id L1.in := L.in addtype(id.entry, L.in) L → id addtype(id.entry, L.in) 上次课主要内容——翻译模式 语义动作被嵌入到产生式右部的适当位置,在推导过程中完成语义处理 D → T L T → int T → real L → L1 , id L → id 第7章 语义分析和中间代码生成 主要内容 中间代码 赋值语句的翻译 控制语句的翻译(if、循环) 属性文法的实现 说明语句翻译 组合数据说明的翻译 过程调用翻译 7.1 中间代码 作用 过渡:经过语义分析被译成中间代码序列 形式 中间语言代码 优点 便于编译系统的实现、移植、代码优化 常用的中间代码(语言) 三地址码(四元式) 语法(结构)树(三元式) 抽象语法树 带注释的语法树 后缀式——逆波兰表示 特点 形式简单、语义明确、便于翻译 独立于目标语言 例 7-1 表达式 (A - 12) * B + 6 的中间代码 以C:=(A-12)*B+6为例将赋值语句变换为结构语法树 属性设置 E.p 是语法结构树指针 id.entry 是名字的表项入口 num.val 是数值 基本函数——结点构造 mknode 建中间结点 mkleaf 建叶结点 语法制导定义(属性文法) 例 7-2:a:=b*(-c)+b*(-34)的语法结构树——直观描述 语法结构树——数组存储形式 地址 算符 操作数1 操作数2 后缀式(逆波兰表示) 二元运算:操作数 1,操作数 2,运算符 一元运算:操作数,运算符 例 8-7: a := b *(- c)+ b *(- 34)的后缀式 a b c - * b 34 - * + := 生成后缀式的属性文法 三地址码 一般形式 x := y op z 其中 x, y, z 为变量名、常数或编译产生的临时变量 四元式(op, y, z, x) 其它语句的三地址码 if x relop y goto l 条件转移语句 (relop,x,y,l) relop:,,=,= goto l 无条件转移 param x 实在参数 call p, n 过程调用 return x 过程返回 x := y[i] 数组运算 x[i] := y x := y 指针运算 x := *y *x = y 生成三地址码的属性文法 注: || 表示代码序列的连接 《编译原理》(Principles of Compiling) 上次课主要内容 中间代码 三地址码(四元式) 语法(结构)树(三元式) 后缀式——逆波兰表示 属性文法 用属性表示语义——中间代码的生成 上次课主要内容 生成赋值语句的语法结构树的属性文法 上次课主要内容 上次课主要内容 三地址码 x := y op z;四元式(op, y, z,
原创力文档

文档评论(0)