- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 6 章 语义分析 学习目标: 掌握: 依赖图, 属性计算算法 理解: 属性文法, 合成和继承属性, S-属性文法, L-属性文法, 符号表 语义分析概述 1 语义 2 语义分析 3 语义分析的典型实现 4 语义分析的方法 1 语义 与被翻译过程的最终含义密切相关的信息 两种语义 静态语义 被静态定义,在执行前可以确定. 编译器实现静态语义分析 动态语义 只有在执行时才能确定 2 语义分析 要求根据编成语言的规则建立正确性,并保证其正确执行。 典型的语义分析有: 静态类型检查: 运算符的分量类型是否相同? 赋值号的左右边类型是否相同? 形参与实参类型是否相同? 数组下标的类型是否为所允许的类型? 函数说明中的函数类型和返回值的类型是否一致? 其他语义分析: V[E]中的V是不是变量,而且是数组类型? V.i中的V是不是变量,而且是记录类型?i是不是该记录的域名? 每个使用性标识符是否都有声明?有无标识符的重复声明? 3 语义分析的典型实现 构造符号表、记录声明中建立的名字的含义 在表达式和语句中进行类型推断和类型检查以及在语言的类型规则作用域内判断它们的正确性。 4 语义分析的方法 描述 属性文法 用来描述语义 实现 语法制导语义分析 程序的语义内容与它的语法紧密相关的 属性文法 属性文法包括一组属性和属性等式或语义规则 属性是必须进行计算的语言实体的属性 属性等式(或语义规则)描述这些属性的计算如何与语言的文法规则相关 6.1 属性和属性文法 6.2 属性计算算法 6.3 符号表 6.4 程序的语义分析 6.1 属性和属性文法 1 属性 定义 属性是编程语言结构的任意特性 属性的典型例子有: 变量的数据类型 表达式的值 存储器中变量的位置 程序的目标代码 2 属性文法 属性 属性直接与语言的文法符号相联系(终结符和非终结符) 如果X 是一个文法符号,a 是X的一个属性,那么我们把与X关联的 a 的值记作X.a 属性等式(或语义规则) 若有一个属性集合 a1 , . . . , ak 对于每个文法规则 X0→X1 X2 . . . X n, 每个文法符号Xi 的属性值Xi .aj 与规则中其他文法符号的属性值是有关的。 属性等式形如 Xi .aj = fij (X0.a1 , . . . , X0.ak ,X1.a1 , . . . , X1.ak , . . . , Xn .a1 , . . . , Xn .ak ) 其中 fij 是一个数学函数 属性文法 属性a1,…,ak 的属性文法是对语言的所有文法规则的所有这类等式的集合 一般地,将属性文法写成表格形式 例1 无符号数的属性文法: 数的属性是它的值 使用字符串的语法树可以形象化地表示特殊符号串的属性等式的意义。 例 2 变量声明的属性文法: 变量的属性是数据类型 例 3 表达式类型检查的属性文法: 表达式的属性是它的类型 可能出现在属性等式中的表达式类型 数值表达式、逻辑表达式以及一些其他种类的表达式 If-then-else 表达式, case 或 switch表达式 也可以是函数,函数的定义可以在别处给出,作为属性文法的补充的定义。 6.2 属性计算算法 将属性等式转换为计算规则的方式 属性在语法分析器构造语法树后计算 (6.2.2) 属性在语法分析时计算 (6.2.3) 实现对应于属性文法的算法规则的问题 属性文法是一种抽象表示,可以将属性等式写成任何顺序而不会影响正确性,它们不指定属性计算的顺序 问题主要在于为赋值和属性分配寻找一个顺序,并确保当每次进行计算时使用的所有属性值都是有效的。 属性等式本身指示了属性计算时的顺序约束,我们使用 相关依赖图 表示这些约束来明确顺序的约束 6.2.1 相关依赖图和赋值顺序 相关依赖图 给定一个属性文法,每个文法规则有一个相关依赖图 每个文法符号的每个属性 Xi.aj 对应一个节点 对每个属性等式 Xi.aj=fij(…,Xm.ak,…) ,从右边的每个节点Xm.ak 到节点 Xi.aj有一条边(表示Xi.aj 对Xm.ak的依赖) 由上下文无关文法得到的一个合法字符串的依赖图 就是字符串语法树中选择表示每个(非叶子)节点文法规则依赖图的联合。 例 1 无符号数的属性文法: 文法规则的依赖图: number1-number2 digit {number1.val=number2.val*10+digit.val} 6.2.2 合成和继承属性 属性赋值依赖于分析树或语法树明确或不明确的遍历。 不同种类的遍历处理的属性相关,在项目和能力的种类上都不同。 必须根据它们具有的相关依赖种类对属性分类 合成属性 继承属性 1 合成属性 定义 一个属性是合成的,如果在语法树中它所有的
文档评论(0)