首页 理论教育编译过程,错误检查与处理

编译过程,错误检查与处理

【摘要】:程序设计人员设计的源程序可能存在各种各样的错误,编译程序在进行上述编译工作时,每一个环节都可能发现源程序中存在的错误,所以,编译过程还要包括错误检查和处理程序。图7-9 编译过程的逻辑结构词法分析、语法分析和语义分析是编译过程的基础。

程序设计人员使用的高级语言是一个语言系统,机器语言是另一个语言系统,编译是把高级语言系统的源程序翻译成等价的机器语言系统的目标程序。因此,编译过程类同于人类之间两种语言系统(如英语到汉语)的翻译。

一个翻译人员要把用英语写的文字翻译成意义相同的汉语的文字,他必须具备理解英文单词的能力,理解英文单词构成句子的规则,理解英文句子所对应的汉语含义。这三种能力是完成翻译工作的基础;要达到好的翻译(例如一个文学作品的翻译)效果,还要在上述初步翻译的基础上进行修辞加工,最后才能得到好的汉语翻译文字。

类似地,编译程序要把用高级语言编写的源程序翻译成等价的机器语言形式的目标程序,编译程序就要能够识别出单词,掌握单词组成语句的规则,理解语句的含义,并要能够在此基础上,实现机器语言程序的优化,最后得到计算机可高效率执行的机器语言形式的目标程序。翻译过程和编译过程的对比见表7-4。

表7-4 翻译过程和编译过程的对比

从表7-4可见,编译过程至少包括五个子过程,即词法分析、语法分析、语义分析、代码优化和目标代码生成。这五个子过程不是互不相关的,而是紧密相关的,上一步工作是下一步工作的基础。因此,上一步程序要把工作的结果传送给下一步程序,编译过程还需要一个负责完成程序间信息传递工作的程序,这个程序在编译程序中称作信息表管理程序。程序设计人员设计的源程序可能存在各种各样的错误,编译程序在进行上述编译工作时,每一个环节都可能发现源程序中存在的错误,所以,编译过程还要包括错误检查和处理程序。因此,完整的编译过程应该包括七个子过程,这七个子过程之间的逻辑关系如图7-9所示。

图7-9 编译过程的逻辑结构(www.chuimin.cn)

词法分析、语法分析和语义分析是编译过程的基础。要使编译过程有效地进行,首先要解决的问题是如何确切地定义一种高级语言,其次要解决的问题是如何识别和分析这种高级语言。形式语言是解决上述两个问题的基础。

1959年,语言学家乔姆斯基在对一些自然语言语法研究的基础上,提出了一种用来描述语言(包括高级程序设计语言)的上下文无关文法。上下文无关文法是用一组数学符号和规则来描述语言的。利用上下文无关文法,对语言的分析过程变成了把具体的语句和该语言允许的文法规则进行匹配的过程。如果程序中的一条语句和该语言允许的任何一条文法规则相匹配,就认为该语句是正确的;如果程序中的一条语句和该语言允许的所有文法规则都不匹配,就认为该语句是错误的。

上下文无关文法可以表示成语法图的形式。例如,C语言赋值语句的语法图如图7-10所示。C语言程序的任何一条语句只要能归纳成图7-10中最上面的符号形式,就认为该语句是一条正确的赋值语句。如语句sum=sum+n就是一条正确的赋值语句,而语句sum=sum#n就不是一条赋值语句,因为符号“#”使该语句和赋值语句语法图中的所有规则都不匹配。

图7-10 赋值语句的语法分析树