- 1、本文档共118页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本章在编译程序中的地位 内容安排 6.1 概述 6.2 属性文法 6.3 几种常见的中间语言 (*四元式) 6.4 表达式及赋值语句的翻译 6.5 控制语句的翻译 6.6 数组元素的翻译 6.7 过程或函数调用语句的翻译 *6.8 说明语句的翻译 6.1 概 述 6.1.1 语义分析的概念 一个源程序经过词法分析、语法分析之后,表明该源程序在书写上是正确的,并且符合程序语言所规定的语法。但是语法分析并未对程序内部的逻辑含义加以分析,因此编译程序接下来的工作是语义分析,即审查每个语法成分的静态语义。如果静态语义正确,则生成与该语言成分等效的中间代码,或者直接生成目标代码。 直接生成目标代码 直接生成机器语言或汇编语言形式的目标代码的优点是编译时间短且无需中间代码到目标代码的翻译。 生成中间代码 生成中间代码的优点是使编译结构在逻辑上更为简单明确,特别是使目标代码的优化比较容易实现。 语义分析时语义检查的分类: 动态语义检查 需要生成相应的目标代码,它是在运行时进行的; 例如:除零溢出错误。 静态语义检查 在编译时完成的,它涉及以下几个方面: (1) 类型检查 (2) 控制流检查 (3) 一致性检查 各种条件表达式的类型不是布尔类型; 运算符的分量类型不相容; 赋值语句左右类型不相容; 形、实参类型不相容; 函数说明和函数返回类型不相容; …… (2) 控制流检查 用以保证控制语句有合法的转向点。如C语言中不允许goto语句转入case语句流;break语句需寻找包含它的最小switch、while或for语句方可找到转向点,否则出错。 (3) 一致性检查 如在相同作用域中标识符只能说明一次、case语句的标号不能相同、函数调用参数个数要相同等。 常见的语义错误 声明和使用相关的语义错误 标识符没有声明; 重复声明; 如何检查? 每当遇到新声明的标识符,查符号表 如果当前有效的所有标识符中有相同名字的,则是重复声明错误; 否则生成它的属性信息,保存到符号表中; 每当遇到标识符的使用,查符号表 如果没有找到,说明该标识符没有声明; 否则, 得到该标识符的属性,进行进一步分析; 语义分析阶段只产生中间代码而不生成目标代码的方法使编译程序的开发变得较为容易,但语义分析不像词法分析和语法分析那样可以分别用正规文法和上下文无关文法描述。 由于语义是上下文有关的,因此语义的形式化描述是非常困难的,目前较为常见的是用属性文法作为描述程序语言语义的工具,并采用语法制导翻译的方法完成对语法成分的翻译工作。 语法制导翻译的方法就是为每个规则配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。 语义动作是为规则赋予具体意义的手段,它一方面指出了一个规则所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。 在语法分析过程中,当一个规则获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此规则相应的语义子程序就进入工作,完成既定的翻译任务。 语法制导翻译分为自下而上语法制导翻译和自上而下语法制导翻译,我们重点介绍自下而上语法制导翻译。 假定有一个自下而上的LR分析器,我们可以把这个LR分析器的能力加以扩大,使它能在用某个规则进行归约的同时调用相应的语义子程序进行有关的翻译工作;每个规则的语义子程序执行之后,某些结果(语义信息)必须作为此规则的左部符号的语义值暂时保存下来,以便以后语义子程序引用这些信息。 此外,原LR分析器的分析栈也加以扩充,以便能够存放与文法符号相对应的语义值。这样,分析栈可以存放三类信息:分析状态、文法符号及文法符号对应的语义值。扩充后的分析栈如图6–1所示。 作为一个例子,我们考虑下面的文法及语义动作所执行的程序: 规则 语义动作 (0) S→E print val[TOP] (1) E→E(1)+E(2) val[TOP]=val[TOP]+val[TOP+2] (2) E→E(1)*E(2) val[TOP]=val[TOP]*val[TOP+2] (3)
文档评论(0)