- 3
- 0
- 约14.61万字
- 约 69页
- 2019-09-25 发布于四川
- 举报
下载
下载
第6章 语 义 分 析
本章要点
• 属性和属性文法 • 数据类型和类型检查
• 属性计算算法 • TINY语言的语义分析
• 符号表
本章要研究的编译程序阶段是计算编译过程所需的附加信息。这个阶段称作语义分析,
因为它包括计算上下文无关文法和标准分析算法以外的信息,因此,它不被看成是语法 。信
息的计算也与被翻译过程的最终含义或语义密切相关。因为编译器完成的分析是静态 (它在执
行之前发生)定义的,这样,语义分析也可称作静态语义分析 (static semantic analysis) 。在一
个典型的静态类型的语言 (如C语言) 中,语义分析包括构造符号表、记录声明中建立的名字的
含义、在表达式和语句中进行类型推断和类型检查以及在语言的类型规则作用域内判断它们
的正确性。
语义分析可以分为两类。第 1类是程序的分析,要求根据编程语言的规则建立其正确性,
并保证其正确执行。对于不同的语言来说,语言定义所要求的这一类分析的总量变化很大。在
L I S P和S m a l l t a l k这类动态制导的语言中,可能完全没有静态语义分析;而在 A d a这类语言中就
有很强的需求,程序必须提交执行。其他的语言介于这两种极端情况之间 (例如P a s c a l语言,不
像A d a和C对静态语义分析的要求那样严格,也不像 L I S P那样完全没有要求) 。
语义分析的第2类是由编译程序执行的分析,用以提高翻译程序执行的效率。这一类分析
通常包括对“最优化”或代码改进技术的讨论。第 8章“代码生成”中将研究一些这样的方法,
而本章则集中讨论语言定义对正确性要求的一般分析。读者应该注意到,这里研究的技术对两
类情况都适用。这两类分析也不是相互排斥的,因为与没有正确性要求的语言相比,如静态类
型检查这样的正确性要求能使编译程序产生更加有效的代码。另外,值得注意的是,这里讨论
的正确性要求永远不能建立程序的完全正确性,正确性仅仅是部分的。但这样的要求仍然是有
用的,可以给编程人员提供一些信息,提高程序的安全性和有效性。
静态语义分析包括执行分析的描述 ( d e s c r i p t i o n ) 和使用合适的算法对分析的实现
( i m p l e m e n t a t i o n ) 。在这里,它和词法及语法分析相类似。例如,在语法分析中,我们使用
B a c k u s - N a u s范式( B N F ) 中的上下文无关文法描述语法结构,并用各种自顶向下和自底向上的分
析算法实现语法结构。在语义分析中,情形不是那么清晰,其部分原因是没有用标准的方法
(如B N F )来说明语言的静态语义;另一个原因是对于各种语言,静态语义分析的种类和总量的
变化范围很大。编译程序编写者过去常用的且实现得很好的一种描述语义分析方法是:确定语
言实体的属性( a t t r i b u t e )或特性,它们必须进行计算并写成属性等式 (attribute equation)或语义规
则(semantic rule) ,并描述这些属性的计算如何与语言的文法规则相关。这样的一组属性和等
式称作属性文法(attribute grammar) 。属性文法对遵循语法制导语义(syntax-directed semantic)原
这一点在第3章的3 . 6 . 3节进行了较为详细的讨论。
第 6章 语 义 分 析 1 9 9
下载
理的语言最有用,它表明程序的语义内容与它的语法密切相关。所有的现代语言都有这个特性。
然而,编译程序的编写者通常必须根据语言手册手工构造属性文法,因为语言设计者很少为之
提供。更糟糕的是,由于坚持语言清晰的语法结构,属性文法的构造会有不必要的复杂性。语
义计算表达式的一种更好标准是抽象语法,就像抽象语法树表示的那样。但是抽象语法树的说
明通常也由语言设计者留给了编译程序编写者。
原创力文档

文档评论(0)