|
|
|
|
|
编译程序的功能是把用高级语言书写的源程序翻译成与之等价的目标程序。编译过程划分成词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成6个阶段,实际的编译器可能会将其中的某些阶段结合在一起进行处理,比如说表格管理和出错处理与上述6个阶段都有联系。
|
|
|
|
|
|
词法分析阶段的任务是对源程序从前到后(从左到右)逐个字符进行扫描,从中识别出一个个"单词"符号。"单词"符号是程序设计语言的基本语法单位,如关键词、标识符等。词法分析程序输出的"单词"常常采用二元组的方式,即单词类别和单词自身的值。
|
|
|
|
|
|
语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,如"表达式""语句"和"程序"等。
|
|
|
|
词法分析和语法分析本质上都是对源程序的结构进行分析。
|
|
|
|
|
|
语义分析阶段主要是审查源程序是否存在语义错误,并收集类型信息供后面的代码生成阶段使用,只有语法和语义都正确的源程序才能翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。
|
|
|
|
|
|
中间代码是一种结构简单且含义明确的记号系统,可以有多种形式。中间代码的设计原则主要有两点:一是容易生成;二是容易被翻译成目标代码。中间代码生成阶段的工作就是根据语义分析的输出生成中间代码。
|
|
|
|
|
|
|
|
代码优化阶段的任务是对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段进行。
|
|
|
|
|
|
目标代码生成阶段的任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。这是编译的最后阶段,它的工作与具体的机器密切相关。
|
|
|
|
|
|
符号表管理阶段的任务是在符号表中记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成。符号表的建立可以始于词法分析阶段,也可以放到语法分析阶段,但符号表的使用有时会延续到目标代码的运行阶段。
|
|
|
|
|
|
用户编写的源程序中的错误大致可分为静态错误和动态错误。动态错误也称为动态语义错误,指程序中包含的逻辑错误。静态错误是指编译阶段发现的程序错误,可分为语法错误和静态语义错误。出错处理程序的任务包括检查错误、报告出错信息、排错、恢复编译工作。
|
|
|
|
|
|
|
|
描述语言语法结构的形式规则称为文法。文法G是一个四元组,可表示为G=(VN,VT,P,S),其中VT是一个非空有限集,其中的每个元素称为一个终结符;VN是一个非空有限集,其每个元素称为非终结符。VN∩VT=?。P是产生式的有限集合,每个产生式是形如α→β的规则,其中α称为产生式的左部,β称为产生式的右部。S∈VN,称为开始符号,它至少要在一条产生式中作为左部出现。
|
|
|
|
|
|
乔姆斯基把文法分成4种类型,即0型、1型、2型和3型。
|
|
|
|
|
|
(1)1型文法也称为上下文有关文法,这种文法意味着对非终结符的替换必须考虑上下文,并且一般不允许替换成ε串,此文法对应于线性有界自动机。
|
|
|
|
(2)2型文法是上下文无关文法,对非终结符的替换无须考虑上下文,它对应于下推自动机。
|
|
|
|
(3)3型文法等价于正规式,因此也称为正规文法或线性文法,它对应于有限状态自动机。
|
|
|
|
|
|
|
|
(1)推导和直接推导。从文法的开始符号S出发,反复使用产生式,将产生式左部的非终结符替换为右部的文法符号序列,直至产生一个终结符的序列时为止。若有产生式α→β∈P,γ,δ∈V*,则γαδ?γβδ称为文法G中的一个直接推导。
|
|
|
(2)直接归约和归约。若文法G中有一个直接推导α?β,则称α是β的一个直接归约;若文法G中有一个推导 ,则称γ是δ的一个归约。
|
|
|