第1章 引论
1.1 什么是编译程序
- 功能:高级语言程序(源程序)→【编译程序】→低级语言程序(目标程序)
-
过程:
需预处理的源程序→【预处理程序】→源程序→
【编译程序】→目标汇编语言程序→【汇编程序】→
可再装配的机器代码[+可再装配目标文件]→
【装配/连接编辑程序】→绝对机器代码
1.2 编译过程和编译程序的结构
-
阶段:
源程序→【词法分析】→【语法分析】→【语义分析】→
【中间代码生成】→【代码优化】→【目标代码生成】→目标程序 - =====================================================
-
结构:
【词法分析程序】+【语法分析程序】+【语义分析程序】+
【中间代码生成程序】+【代码优化程序】+【目标代码生成程序】+
【表格管理程序】+【出错处理程序】 - =====================================================
-
组合:
前端(front end)工作主要依赖于源语言而与目标机无关;
后端(back end)工作依赖于目标机而一般不依赖于源语言。
1.3 解释程序
- 区别:编译产生中间代码。
第2章 文法和语言
2.2 符号和符号串
-
字母表:元素的非空有穷集合,元素称为符号,因此字母表也成为符号集。
-
符号串:字母表中的符号组成的任何有穷序列,讲究顺序,允许空符号串,其长度为,即。符号串有头/尾,头/尾非空称为固有头/尾。符号串有连接/方幂/集合运算,其中,是连接运算的单位元,即。指定字母表为,则表示字母表上所有有穷长的串的集合,称为的闭包,称为正闭包。
-
规则:也称重写规则、产生式或生成式,是形如或的。其中,称为左部,称为右部,符号读作“定义为”。
-
文法定义为四元组,其中,为非终结符集/语法实体集/变量集,为终结符集,为产生式的集合,且至少有一个是非终结符,为识别符/开始符,也是非终结符,至少要在一条产生式中作为左部出现。,,称为文法的字母表/字汇表。。
-
推导:直接推导,长度为的推导,长度为的推导。直接推导:,如果,则,称直接产生,或是的直接推导,或直接归约到。若有或,则记作。
2.3 文法和语言的形式定义
-
对于文法,为符号串,若,则称是文法的句型;若仅由终结符号组成,即,则称为的句子。
-
可用表示文法所产生的语言——集合。文法描述的语言是该文法一切句子的集合。若,则称文法和是等价的。
-
文法的类型:乔姆斯基(Chomsky)于1956年建立形式语言的描述,把文法分为四种类型,即0型、1型、2型和3型。设,产生式:
2.4 文法的类型
-
0型文法/短语文法,满足且至少有一个是非终结符,能力相当于图灵机,0型语言都是递归可枚举的,反之递归可枚举集必是一个0型文法;
-
1型文法/上下文有关文法,除外,满足;
-
2型文法/上下文无关文法,满足是一个非终结符且,也表示成,用取代非终结符时,与所在的上下文无关;
-
3型文法/正规文法,满足或,且,其中都是非终结符。
2.5 上下文无关文法及其语法树
- 语法树/推导树,满足下列四个条件:
- 每个结点都有一个标记,是的一个符号;
- 根的标记是;
- 若一个结点至少有一个除自己外的子孙,且有标记,则;
- 若结点的直接子孙从左到右的次序是,其标记分别为,则一定是中的一个产生式。
-
如果推导的任何一步都是对最左/最右的非终结符进行替换,则称为最左/最右推导。最右推导常称为规范推导,得到的句型称为右句型/规范句型。
-
如果一个文法存在某个句子对应两棵不同的语法树,或者说,若一个文法存在某个句子有两个不同的最左/最右推导,则说该文法是二义的。文法的二义性≠语言的二义性,存在的可能。如果产生上下文无关语言的每个文法都是二义的,则说此语言是先天二义的。理论证明,判定任给的一个上下文无关文法是否为二义的,或者该文法是否产生一个先天二义的上下文无关语言,都是递归不可解的问题——不存在一个算法,能在有限步骤内确切判定任给的一个文法是否为二义的。
2.6 句型的分析
- 定义:,是文法的一个句型,若且,则称是句型相对于非终结符的短语。特别地,若,则称是句型相对于产生式的直接短语/简单短语。一个右句型的直接短语称为该句型的句柄。
2.7 文法应用的补充说明
-
文法中不能存在有害规则(形如,引起文法的二义性)和多余规则(不可到达的和不可终止的)。
-
对于文法,为保证非终结符在句子推导中出现,须满足:
- 必须出现在某句型中,即有;
- 必须能从推导出终结符号串,即。
第3章 词法分析
3.3 单词的形式化描述工具
3.3.1 正规文法
- 即3型文法,。
3.3.2 正规式
- ……
3.3.3 正规文法等价于正规式
- 正规式转换成正规文法:
正规式 | 文法产生式 | |
---|---|---|
规则1 | ||
规则2 | ||
规则3 |
- 正规文法转换成正规式:
文法产生式 | 正规式 | |
---|---|---|
规则1 | ||
规则2 | ||
规则3 |
3.4 有穷自动机
- 确定的有穷自动机(DFA)和不确定的有穷自动机(NFA)。
3.4.1 DFA
-
:
是有穷集,其每个元素称为一个状态;
是有穷字母表,其每个元素称为一个输入符号,故又称输入符号表;
是转换函数,是,令,当前状态为,输入字符为时,将转换到下一状态,称作的一个后继状态;
是唯一的一个初态;是一个终态集,终态也称可接受状态/结束状态。 - 若,,则称可为该DFA所接受/识别。
- DFA所能接受的符号串的全体记为。上的一个符号串集是正规的,当且仅当存在一个上的确定有穷自动机,使得。
3.4.2 NFA
-
:
是有穷集,其每个元素称为一个状态;
是有穷字母表,其每个元素称为一个输入符号;
是一个的全体子集的映像,
即,其中表示的幂集;
是一个非空初态集;是一个终态集。 - 对于每个NFA,都存在一个DFA,使得。对于任何两个有穷自动机,若,则称两者是等价的。
3.4.3 NFA转换为等价的DFA
- 子集构造算法:
:能够从NFA的状态开始只通过转换到达的NFA状态集合
:能够从中某个NFA状态开始只通过转换到达的NFA状态集合,即
:能够从中某个状态出发通过标号为的转换到达的NFA状态集合
- NFA的开始状态集合用标记,,然后反复依次读取字母表,每次记录变化的NFA状态集合同时进行标记,直到某个NFA状态集合包含终止符号,则最后一次读取字母表并记录和标记NFA状态集合。
例如(字母表为,状态集合包含终止符):
NFA状态 | DFA状态 | a | b |
---|---|---|---|
A | B | C | |
B | B | D | |
C | B | C | |
D | B | E | |
E | B | C |
3.4.4 DFA的化简
- 两个状态等价的条件:
- 一致性——两者必须同时为可接受/不可接受状态;
- 蔓延性——对于所有输入符号,两者必须转换到等价的状态里。
- 分割法:
-
首先把的状态分成两个子集,一个由终态组成,另一个由非终态组成,初始化划分为,两个子集任何状态之间都不等价;
-
读入输入符号,观察第一个子集,发现两组状态分别转换到终态和非终态,即这两组状态之间不等价,因此将其划分为;
-
接着试图在中寻找一个子集和一个输入符号使得其状态可区别,然后得到;
-
继续上述过程,直到不能再划分,令代表消去,代表消去,得到化简之后的DFA。
3.5 正规式与有穷自动机的等价性
- 为NFA构造正规式:
-
在的状态转换图上加两个结点,从结点用弧连接到的所有初态结点,从的所有终态结点用弧连接到结点,形成一个与等价的,后者只有一个初态和一个终态。
-
逐步消去中所有结点,最后只剩下结点,消去过程逐步用正规式来标记弧,规则如下:
(1)
(2)
(3)
- 为正规式构造NFA:
-
为构造NFA:
(1)
(2)
(3) -
若为上的正规式,相应的NFA分别为:
(1)
(2)
(3)
3.6 正规文法与有穷自动机的等价性
- ……
第4章 自顶向下语法分析方法
4.1 确定的自顶向下分析思想
-
直观的文法特点:
(1)每个产生式的右部都由终结符号开始;
(2)若两个产生式有相同左部,则其右部由不同终结符开始。 -
不直观的文法特点:
(1)产生式右部不全是由终结符开始;
(2)如果两个产生式有相同左部,则其右部由不同终结符或非终结符开始;
(3)文法中无空产生式。
=======================================================
- 集合
若,则规定。
-
若是终结符号,则。
-
若是非终结符号,且,则令,从开始逐个扫描:如果不成立,则将的所有符号都加入,然后停止扫描;如果,则将加入;
-
若是产生式,则将加入。
=======================================================
- 集合
若,则。
-
将加入,其中是开始符号,而是输入右端的结束标记。
-
若存在,则中除外的所有符号都在中。
-
若存在,或存在且包含,则的所有符号都在中。
=======================================================
- 集合:
给定:
=======================================================
4.2 文法的判别
-
对每个非终结符的两个不同产生式,满足:
-
文法是的,当且仅当的任意两个不同产生式满足条件:
- ;
- 若在中,则;
- 若在中,则。
4.3 某些非文法到文法的等价变换
4.3.1 提取左公因子
-
一般形式:
提取左公因子:
引进非终结符: -
如果产生式右部以非终结符开始,可能存在隐式的左公因子,这种情况下,
用左部与之相同而右部以终结符开始的产生式完全替换其右部开始的非终结符。
4.3.2 消除左递归
-
消除直接左递归
消除直接左递归后改写成:
-
消除间接左递归
- 以下文法为例:
对非终结符进行排序,先消除的立即左递归,
然后将代入,进行替换,消掉中间符号,
最后对消除直接左递归,得到最终消除结果。
4.4 不确定的自顶向下分析思想
第6章 分析
6.1 分析概述
-
一个分析器由3个部分组成:
1)总控/驱动程序,所有分析器的总控程序都相同;
2)分析表/分析函数,不同文法/同一文法采用不同分析器,分析表均不同,而分析表分为动作(ACTION)表和状态转换(GOTO)表,都用二维数组表示;
3)分析栈,包括文法符号栈和相应的状态栈,均是FILO。 -
分析器的动作由栈顶状态和当前输入符号来决定,其中,分析器不需要向前查看输入符号。分析器的工作过程如下:
1)为栈指针,为状态栈,为文法符号栈。状态转换表由关系GOTO确定,意思是当栈顶状态为遇到当前文法符号为时,应转向状态,为终结符/非终结符。
2)规定栈顶状态为遇到输入符号应执行的动作,有4种可能:
①移进
②归约
③接受acc
④报错
第7章 语法制导的语义计算
7.1 基于属性文法的语义计算
7.1.1 属性文法
-
基本概念和术语
在文法基础上,为文法符号关联有特定意义的属性,并为产生式关联相应的语义动作或条件谓词,称之为属性文法,并称该文法是这一属性文法的基础文法。例如:
上述属性文法可以接受的语言是。稍作修改:
若输入串属于,则语义计算结果会执行语句,反之执行语句。
-
综合属性和继承属性
对关联于产生式的语义动作,若是的某个属性,则称其是的一个综合属性。从分析树的角度,计算综合属性是对父结点的属性赋值,是自底向上传递信息。
对关联于产生式的语义动作,若是产生式右部某个文法符号的某个属性,则称其是文法符号的一个继承属性。从分析树的角度,计算继承属性是对子结点的属性赋值,是自顶向下传递信息。
其中,是综合属性,是继承属性。对于前者进行自底向上计算,对于后者进行自顶向下计算。
7.1.2 遍历分析树进行语义计算
7.1.3 属性文法和属性文法
只包含综合属性的属性文法称为属性文法。
属性文法是属性文法的一个特例。
网友评论