[工学]第7章语义分析.ppt

  1. 1、本文档共72页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第7章语义分析

第七章 语义分析 语法制导翻译技术应用于语义分析 语义处理的工作 7.1 中间代码 源程序经过语义分析被译成中间代码序列 用中间语言过渡的好处: 与目标机无关 便于编译系统的实现、移植、代码优化 常用的中间代码(语言) 三地址代码(三元式、四元式) 语法(结构)树 后缀式——逆波兰表示 特点 形式简单、语义明确、便于翻译 独立于目标语言 7.1.1后缀式(逆波兰表示) 操作数 1 操作数 2 运算符 操作数 运算符 定义: E(常、变量)的后缀式为E自身 E1 op E2 的后缀式为E1′E2′op (E)的后缀式为E的后缀式 例 : a := b *(- c)+ b *(- 34)的后缀式 a b c - * b 34 - * + := 生成后缀式的属性文法 生成后缀式的算法 自顶向下方法:递归下降识别程序.当输入符是常、变量或运算符时,输出到后缀式区 7.1.2抽象语法树 将规则式中操作符作为分支(父)结点,将操作数作为叶结点。 建立抽象语法树 属性设置: E.p, T.p, F.p是语法结构树指针 id.entry 是名字的表项入口 num.val 是数值 基本函数——结点构造 mknode 建中间结点 mkleaf 建叶结点 语法制导定义(属性文法) 例 X := i1+i2*i3 的语法结构树 7.1.3三地址代码 一般形式 x := y op z 其中 x, y, z 为变量名、常数或编译产生的临时变量 四元式(op, y, z, x) 三元式(op, y, z) 其它语句的三地址代码 if x relop y goto l 条件转移语句 goto l 无条件转移 param x 实在参数 call p, n 过程调用 return x 过程返回 x := y[i] 数组运算 x[i] := y x := y 指针运算 x := *y *x = y 表达式的四元式表示 算符 操作数 操作数临时变量 地址 算符 操作数 操作数 (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) 生成三地址代码的属性文法 7.2 说明语句翻译 高级语言中的说明语句(Declarations)用于对程序中规定范围内使用的各类变量、常数、过程进行说明 类型 基本类型/内部类型(built-in) 用户定义类型——结构描述 作用域 一般:说明所在的分程序、过程 文法描述 P → D D → D ; D D → id : T T → integer T → real T → array[num] of T1 T → ^T1 变量说明的翻译 在符号表中填写变量的属性 种别、类型、相对地址、作用域……等 相对地址 全局变量表示为静态数据区的相对于基址偏移值(offset) 局部变量表示为局部数据域的偏移值 例 7-1:相对地址举例 名字 相对地址 x 0 i 64 j 68 属性、过程、与全局量 类型T的属性 type 类型 width 占用的字节数 基本子程序 insert:设置变量的类型和地址,填表 array:数组类型处理 全局量 offset:已分配空间字节数 说明语句的翻译模式 P → D D → D ; D D → id : T T → integer T → real T → array[ num ] of T1 T → ^T1 例 7-2:x:real; i:integer 的翻译 insert(x,real,0) 说明语句的翻译模式 为了使所有的语义动作都在规则式末尾,从而实现自底向上的计算属性值,在文法中引进标记非终极符 7.2.2 过程说明的翻译 P → D D → D ; D D → id : T D → proc id;D;S T → integer T → real T → array[num] of T1 T → ^T1 赋值语句的四元式翻译 注释: || 表示代码序列的连接 例 : 翻译 a:= -c+b*34 a:= -c+b*34的中间代码的生成过程 S.code = E.code || gen( ‘a:=‘E.place ) /* ‘a’ ~ id.place */ = E1.code || E2.code

文档评论(0)

ctuorn0371 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档