编译原理与技术-知识点整理(自用)
概念:把源程序转换成等价的目标程序,这个过程就是所谓的编译。编译程序是现代计算机系统的基本组成部分之一。
编译原理考试版-混子速成期末保过:https://www.bilibili.com/video/BV1ft4y1X7p6?p=1 (小姐姐声音也可好听,哈哈)不想看的可以直接看视频(纯题目讲解)
第一章 编译概述
1.1翻译程序:
编译程序
- 汇编程序:汇编语言->机器语言
- 编译程序:高级语言->汇编语言|机器语言
解释程序
- 解释程序是一个一个的获取、分析并执行源程序语句,一旦一个语句分析完成,解释程序便开始运行并生成结果。语言程序的调试就可以用解释器来实现
1.2编译的阶段和任务:
- 分析阶段(词法分析、语法分析、语义分析)
- 综合阶段(中间代码生成、代码优化、代码生成)
1.3编译有关的其他概念
- 前端:主要由与元语言有关而与目标机器无关的那些部分组成,通常包括词法分析、语法分析、语义分析和中间代码生成、符号表的建立,以及机器无关的代码优化工作,还包括相应的错误处理工作和符号表操作。
- 后端:由编译程序中与目标机器有关的部分组成,一般来讲,这些部分与源语言无关而仅仅依赖于中间语言,包括目标代码的生成、与机器有关的代码优化,以及相应的错误处理和符号表操作。
- “遍”的概念:一“遍”是指对源程序或其中间表示形式从头到尾扫描一遍,并做相关的加工处理,生成新的中间表示形式或目标程序。每一遍完成一个或相连几个逻辑部分的工作。eg:第一遍进行词法分析,第二遍进行语法分析,第三遍进行语义分析诸如此类。
预处理器/汇编程序:略。
第二章 形式语言语言与自动机基础
2.1 字母表和符号串
- 字母表:符号的非空有限集合。典型的符号是字母、数字、各种标点和运算符等。eg:{0,1}是二进制数的字母表,计算机使用的字母表常见的由ASCII字符集和EBCDIC字符集。
- 符号串:定义在某一字母表上的符号串是由该字母表中的符号组成的有限符号序列。eg:010011、0101等是字母表{0,1}上的符号串。aa、ab、abababab等是定义在字母表{a,b}上的符号串。
- 符号串长度:串中出现符号的个数。
2.2 语言
- 语言定义:在某一确定字母表上的符号串的集合。----语言也可以进行运算。eg:并、交、闭包运算等。
2.3 文法
- 文法定义:文法就是描述语言的语法结构的形式规则。任何一个文法都可以表示为一个四元组G=(,,S,)
- 是一个非空有限集合,每个元素称为终结符号。
- 是一个非空有限集合,每个元素称为非终结符号。
- S是一个特殊的非终结符号,称为文法的开始符号。开始符号S至少必须在某个产生式的左部出现一次。
- 是一个非空有限集合,每个元素称为产生式。
- 文法分类:
- 0型文法:
- 1型文法:上下文有关文法。
- 2型文法:上下文无关文法。
- 3型文法:正规文法(线性文法)
- 文法书写约定:
- 常做终结符(次序靠前的小写字母,eg:abc等、运算符号,eg:+-*/等,标点,eg:括号、逗号、冒号、等于号等、数字等)
- 常做非终结符(大写字母ABCD、S、小写斜体)
2.4.1 文法二义性消除
消除文法二义的两种方法:
① 改写二义文法为非二义文法;
② 规定二义文法中符号的优先级和结合性,使仅产生一棵分析树。左结合性:
对于A→αAβ
,若A
(左右都有的非终结符)在终结符(即终结符在β中)左边出现,则A产生式具有左结合性质。
如:
E → E + T
是左结合(E
即A
,+
是终结符)。F → (E) | -F
是右结合(F
即A
,-
是终结符)
2.4.2 左递归消除。(略)-后期补充
- 目的:由于自顶向下的语法分析方法不能处理左递归文法,所以对左递归文法进行消除左递归是必须的。
- 例:
2.5 有限自动机(略)-后期补充
定义:有限自动机是具有离散输入与输出的系统的一种数学模型。
重点:状态转换图。
第三章、词法分析
词法分析主要是分析输入的源程序(字符串),输出该字符串中出现的所有的合法的单词。例如:int a = 3 + 5;经过词法分析会输出 int,a,=,3,+,5和;这七个单词。实现词法分析器的官方做法是:
1.写出各个单词的正规式(正则表达式);
2.根据正规式构造NFA(不确定的有限自动机);
3.将NFA转换DFA(确定的有限自动机);
4.根据DFA就可以实现词法分析器,写出程序。
第四章、语法分析
4.1 常用的语法分析
- 语法分析任务:按照语法从源程序几号序列中识别出各种语法成分,同时进行语法检查,为语义分析和代码生成做准备。
- 自顶向下的分析方法:从顶部(根部)到底部(叶子)为输入的记号序列建立分析树。eg:预测分析程序采用的就是自顶向下的分析方法。
- 自底向上的分析方法:自下而上地为输入的记号序列建立分析树。eg:LR分析程序采用的就是自底向上的分析方法。
4.2 语法错误的处理
- 词法错误:非法符号等。
- 语法错误:括号不匹配,缺少运算对象等。
- 语义错误:运算量的类型不相容、实参与形参不匹配等。
- 逻辑错误:无穷的递归调用等。
4.3 自顶向下分析方法 - 后期补充
- 递归下降分析(理论上成立):设法寻找一个最左推导序列,以便通过一步步推导将输入符号串推导出来。
- 递归调用预测分析:适用于LL(1)型文法。再递归下降分析中,
- 首先消除文法左递归--然后找到文法的first集和follow集,判断是否为LL1型文法。--
这只是准备条件(判断是否能为LL1型文法。
利用状态转换图识别输入符号串。(预测分析程序状态转换图的化简)
非递归预测分析:需要构造预测分析表,根据预测分析表进行产生式的选择。
预测分析表的构造过程:(略)
例子:
根据预测分析表对符号串的分析过程:
4.4 自底向上分析方法 (不需要消除左递归)-关键在于找出“可归约串”,然后根据规则判别将它归约为哪个非终结符-(规范归约方法=重点=寻找句柄)
- 过程:试图自下而上地为输入串构造一棵分析树,从树叶开始向上构造,直到树根。采用自左向右扫描。从输入串开始,查找当前句型的“可归约串”,并使用规则把它归约为相应的非终结符号,得到一个新的句型,重复这个过程。直到最后归约到文法开始符号为止。(类似于利用栈实现表达式的计算-中缀、后缀的转换等算法)
- LR分析法(上下文无关文法):
字符 含义 L 表示 从左到右 扫描输入串 R 表示利用 最右分析方法 来识别句子,即构造一个 最右推导的逆过程 k 表示向右查看输入串符号的个数
- 部分:输入、输出、栈、分析控制程序、分析表。
- 分析表的构造:
- 首先为给点文法构造一个识别它的所有活前缀的确定的有限自动机,然后根据此有限自动机构造该文法的分析表。
- 注:点的左边表示已经在栈内的内容。点的右边表示未进栈的内容。(这种写法,表示了当前的状态。)
- 分析过程:
第五章、语法翻译
5.1 任务+步骤
- 把源程序转换成等价的目标程序,即目标程序必须和源程序具有同样的语义。
- 步骤:首先需要根据翻译目标的要求确实每个产生式所包含的语义,进而分析文法中每个富豪的语义,并把这些语义以属性的形式附加到相应的文法符号上(把语义和语言结构联系起来),然后再根据产生式的语义给出符号属性的求职规则(即语义规则),从而形成语法制导定义。这样,当在语法分析过程中使用该产生式时,就可以根据相应的语义规则对属性求值,从而完成翻译。(翻译目标决定了产生式的含义,文法符号应具有的属性,产生是的语义规则)
- 任务:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
- 如何表示语义信息?
- 为CFG中的文法符号设置语义属性,用来表示语法成分对应的语义信息。
- 例如对于一个变量,它的语义属性可以有变量的值,变量的类型等等。
- 如何计算语义属性?
- 文法符号的语义属性值使用与文法符号所在产生式(即语法规则)相关联的语义规则来计算的。
- 对于给定的输入串
x
,构建x
的语法分析树,病利用与产生式(语法规则)相关联的语义规则来计算分析树中个节点对应的语义属性值。语法制导定义(Syntax-Directed Definitions,SDD)
- SDD是对上下文无关文法(CFG)的推广
- 将每个文法符号和一个语义属性集合相关联
- 将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值。
- 如果
X
是一个文法符号,a
是X
的一个属性,则用X.a
来表示属性a
在某个标号为X
的分析树节点上的值。(X可以为终结符或非终结符)
语法制导定义:对应于每一个文法产生式A->a都有与之相联系的一套语义规则,其形式为b=f(c,d,...)这里,f是一个函数,且-1)如果b是A的一个综合属性,则c,d..是产生式右部文法符号的一个继承属性。-2)如果b是产生式右部某个文法符号的一个继承属性,则cd是A或产生式右部任何文法符号的属性。
综合属性:在分析树中,一个节点的综合属性是由其子节点的属性值决定的。用于自下而上传递信息
继承属性:产生式右部某文法符号的继承属性值由左部符号的继承属性和/或右部任何文法符号的属性值决定的。用于自上而下传递信息。(类似于变量的值)
1)终结符只有综合属性,由词法分析器提供,非终结符可有综合属性,也可有继承属性。文法开始符号的所有继承属性作为属性计算前的初始值。(类似于变量的类型)
5.2 语义制导定义-上下文无关文法的一种扩展形式
5.2.1 依赖图-略
5.2.2 语法生成树-重点-参照LR语法分析的归约构建。
第六章、语义分析
6.1 任务
- 将变量的定义与它们各个使用联系起来,对语句的含义进行检查,检查每一个语法成分是否具有正确的语义。
- 任务:对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
6.2 符号表
符号表是第一次遍历,词法分析的时候生成的。
符号表的内容(变量名、数据类型、目标地址、维数或参数个数、声明行、引用行、链域)
6.3 符号表操作
最常用的操作就是插入和检索,这些操作根据所编译的源语言是否具有显式声明而稍有不同。对所有的变量引用都将执行符号表检索操作,检索出的信息(如类型,目标地址和维数等)将被用于类型检查和代码生成,在该阶段进行的检索操作可检查出未定义而使用的变量,并给出相应的错误或警告信息。
第八章、中间代码生成
8.1 中间代码形式(后缀表示、语法树、dag、三地址代码)
任务:中间代码生成程序的任务就是把经过分析阶段所获得的源程序的中间表示翻译成中间代码表示。便于编译程序的建立和移植,便于进行独立与机器的代码优化。
本章使用四元式表示(考试要求)
例题: