【编译原理】基本概念综述

  1. 在计算机上执行一个高级语言程序一般要分为两步:第一步,用一个编译程序把高级语言翻译成机器语言程序;第二步,运行所得的机器语言程序求得计算结果。
  2. 通常所说的翻译程序是指这样的一个程序,它能够把某一语言程序(称为源语言程序)转换为另一种语言程序(称为目标语言程序),后者与前者在逻辑上是等价的。而如果源语言是C、Java这样的“高级语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,那么这样的一个翻译程序就称为编译程序。
  3. 编译程序的工作过程一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
  4. 词法分析的任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字(if、for、while)等,标识符,常数,算符和界符(标点符号、左右括号,/**/等)。词法分析阶段的工作中所依循的是语言的词法规则,描述词法规则的有效工具是正规式和有限自动机。
  5. 语法分析的任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如“短语”、“子句”、“句子”、“程序段”、“程序”等,通过语法分析,确定整个输入串是否构成语法上正确的“程序”。语法分析所依循的是语言的语法规则,这一规则通常由上下文无关文法描述。词法分析是一种线性分析,而语法分析是一种层次结构分析。
  6. 语义分析与中间代码产生的任务是:对语法分析所识别的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。这一阶段通常包括两个方面的工作:首先,对每种语法范畴进行静态语义检查,例如变量是否定义、类型是否正确等等;如果语义正确,则进行另一方面工作,即进行中间代码的翻译。这一阶段所依循的是语言的语义规则,通常用属性文法来描述语言的语义规则。
  7. 许多编译程序采用四元式来作为中间代码的表示形式,四元式的形式:【算符,左操作数,右操作数,结果】.
  8. 源程序中的错误通常分为语法错误和语义错误两大类,语法错误是指源程序中不符合语法或词法规则的错误,它们可以在词法分析或语法分析阶段被检查出来,例如词法分析阶段可以检查出“非法字符”这样的错误,语法分析阶段可以检查出“括号不匹配”、“缺少分号”这样的错误。语义错误是指源程序中不符合语义规则的错误,通常在语义分析时被检测出来,有的语义错误甚至在运行时才能检测出来。语义错误通常包括,说明错误、作用域错误、类型不一致等。
  9. 概念上我们将便于程序划分为编译前端和编译后端。前端主要由与源程序有关与目标机无关的那部分组成,这部分通常包括词法分析、语法分析、语义分析和中间代码产生,有的代码优化工作也可以包括在前端。后端包括编译程序中与目标机有关的部分,如与目标及有关的代码优化和目标代码生成等,通常后端不依赖于源语言,而仅仅依赖于中间语言。
  10. 编译程序T型图来表示源语言S,目标语言T以及编译程序实现语言X之间的关系:
    在这里插入图片描述
    T型图代表的意思是,这是一个用X语言编写的,输入是S语言编写的源程序,输出是T语言编写的目标程序的编译程序。
  11. Σ是一个有穷字母表,它的每个元素称为一个符号。Σ上的一个符号串是指由Σ中的符号所构成的一个有穷序列。不包含任何符号的序列称为空字,记为ε。用Σ*来表示Σ上所有符号串的全体,空字ε也包含在其中。Φ表示不包含任何元素的空集{ },也叫做空语言。
  12. 上下文无关文法所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。例如在程序语言中,当碰到一个算术表达式时,我们完全可以对它“就事论事”进行处理,而不必考虑它所处的上下文。但在自然语言中,一个句子、一个词乃至一个字,它们的语法性质和所处的上下文往往有密切的关系。归纳起来一个上下文无关文法G包括四个组成部分:一组终结符号V T _T ,一组非终结符号V N _N ,一个开始符号S以及一组产生式集合P。
  13. 文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是说,如果一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。文法的二义性问题是不可判定的,即不存在一个算法,它能在有限步骤内判定出一个文法是否为二义性文法。
  14. 我们可能有两个不同的文法G 1 _1 和G 2 _2 ,前者是二义文法,而后者是无二义文法,但L(G 1 _1 )=L(G 2 _2 ),也就是说这两个文法产生的语言是相同的。而且也有一些语言,它是没有无二义文法的,这样的语言是固有二义性的,也叫做先天二义性。