《编译原理》复习要点.docx
《《编译原理》复习要点.docx》由会员分享,可在线阅读,更多相关《《编译原理》复习要点.docx(23页珍藏版)》请在冰豆网上搜索。
《编译原理》复习要点
考试安排:
7 月 13 日(20 周周三),15:
00-17:
00,20208
填空 10X1 分、选择 10X2 分、简答 4X5 分、大题 5X10 分
考试大题:
循环优化
LL
(1).定义之类的
算符优先算法
…
自下而上分析法(20 分,选择、填空、大题)
第一章 引论
一.编译程序(compiler):
把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)
的程序
二.编译程序的工作的五个阶段:
词法分析、语法分析、中间代码产生、优化、目标代码产生
1. 词法分析
任务:
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单
词符号。
依循的原则:
构词规则
Pascal 语言
描述工具:
有限自动机
FORI:
=1TO100DO
保留字 标识符 等符 整常数 保留字 整常数 保留字
2. 语法分析
任务:
在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法
单位。
依循的原则:
语法规则
述工具:
上下文无关文法
3. 语义分析与中间代码产生
任务:
对各类不同语法范畴按语言的语义进行初步翻译。
(变量是否定义、类型
是否正确等)
依循的原则:
语义规则
中间代码:
三元式,四元式,逆波兰记号,树形结构等。
是一种独立于具体硬件
的记号系统。
例:
将 Z:
=X + 0.618 * Y 翻译成四元式为
(1)*0.618YT1
(2)+XT1T2
(3) :
=T2_Z
4. 优化
任务:
对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效
的目标代码。
依循的原则:
程序的等价变换规则
FOR K:
=1 TO 100 DO
BEGIN
M :
= I + 10 * K;
N :
= J + 10 * K;
END
4. 目标代码产生
任务:
把中间代码变换成特定机器上的目标代码。
依赖于硬件系统结构和机器指令的含义
目标代码三种形式:
a)绝对指令代码:
可直接运行
b)可重新定位指令代码:
需要连接装配
c)汇编指令代码:
需要进行汇编
三. 编译程序结构
◆ 编译程序总框 (简答题 5 分)
第二章 高级语言及其语法描述
2.1.1 语法
词法规则:
单词符号的形成规则。
a) 单词符号是语言中具有独立意义的最基本结构。
一般包括:
常数、标识符、
基本字、算符、界符等。
b) 描述工具:
正规式和有限自动机
语法规则:
语法单位的形成规则。
a) 语法单位通常包括:
表达式、语句、分程序、过程、函数、程序等;
c) 描述工具:
上下文无关文法
2.1.2 语义
语义:
一组规则,用它可以定义一个程序的意义。
描述方法:
a)自然语言描述:
隐藏错误、二义性和不完整性
b) 形式描述:
☞无二义性
☞ 完整性
多数语言中,算符的优先顺序如下:
◆ 乘幂(**或↑)
◆ 一元负(-)
◆ 乘、除
◆ 加、减
◆ 关系符(<,=,>,<=,>=,<>)
◆ 非(¬,not)
◆ 与(Λ,&,and )
◆ 或(˅,|,or,)
优
先
级
由
高
自
低
不同的语言对算符优先级
的规定有差异,甚至差异
很大!
◆ 隐含(或 imp)
◆ 等值(或 epui,或~)
2.3 程序语言的语法描述
1. 几个概念:
a)考虑一个有穷 字母表∑ 字符集
b) 其中每一个元素称为一个字符
c)∑上的字(也叫字符串) 是指由∑中的字符所构成的一个有穷序列
d) 不包含任何字符的序列称为空字,记为ε
e) 用∑*表示∑上的所有字的全体,包含空字ε
例如:
设 ∑={a, b},则 ∑*={ε,a,b,aa,ab,ba,bb,aaa,...}
f)∑*的子集 U 和 V 的连接(积)定义为 UV={ αb | α∈U & b∈V }
例如:
设:
U={ a, aa } ,V= { b, bb } 那么:
UV= { ab, abb, aab,
aabb}
g)V 自身的 n 次积记为 Vn=VV…V
h) 规定 V0={ε},令 V*=V0∪V1∪V2∪V3∪… 称 V*是 V 的闭包;
记 V+=VV* ,称 V+是 V 的正规闭包。
例如:
设:
U={ a, aa }
那么:
U* = { ε , a, aa, aaa, aaaa, …}
U+ = { a, aa, aaa, aaaa, …}
i)0 型(短语文法,图灵机):
产生式形如:
α → β
其中:
α∈ (VT ⋃ VN)*且至少含有一个非终结符;β∈ (VT ⋃ VN)*
任何 0 型语言都是递归可枚举的。
j)1 型(上下文有关文法,线性界限自动机):
产生式形如:
α → β
其中:
|α| ≤ |β|,仅 S→ε 例外。
意味着对非终结符进行替换时务必考虑上下文,并且,一般不允许替换成
空串ε 。
k)2 型(上下文无关文法,非确定下推自动机):
产生式形如:
A → β
其中:
A∈ VN;β∈ (VT ⋃ VN)*。
非终结符的替换可以不必考虑上下文。
l)3 型(正规文法,有限自动机):
产生式形如:
A → αB 或 A → α
右线性文法
其中:
α∈ VT*;A,B∈VN
产生式形如:
A → Bα 或 A → α
其中:
α∈ VT*;A,B∈VN
正规文法的能力要比上下文无关文法弱得多。
左线性文法
四种类型描述能力比较
m) 上下文无关文法的定义:
一个上下文无关文法 G 是一个四元式
G=(VT,VN,S,P),其中
VT:
终结符集合(非空)
VN:
非终结符集合(非空),且 VT ⋂ VN=∅
S:
文法的开始符号,S∈VN
P:
产生式集合(有限),每个产生式形式为
P→α, P∈VN, α ∈ (VT ⋃ VN)*
开始符 S 至少必须在某个产生式的左部出现一次。
例:
文法 G1(A):
A → c|Ab
G1(A)的语言?
解:
L(G1)={c,cb,cbb,⋯},以 c 开头,后继若干个 b
n)定义:
如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法
是二义的。
G(E):
E → i|E+E|E*E|(E) 是二义文法。
o) 语言的二义性:
一个语言是二义性的,如果对它不存在无二义性的文法。
可能存在 G 和 G’,一个为二义的,一个为无二义的。
但 L(G)=L(G’)
2. 状态转换图
a) 概念:
状态转换图是一张有限方向图。
b) 结点代表状态,用圆圈表示。
c) 状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输
入字符或字符类。
d) 一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态
3. 正规运算符优先顺序
在不致混淆时,括号可以省去,但规定算符的优先顺序为:
*(闭包).(连接)|(或)
4. 3 型文法-正规式
G 的任何产生式为 A → αB 或 A → α
其中:
α∈ VT*;A,B∈VN
3 型文法等价于正规式,所以也称正规文法。
3.3.2 确定有限自动机(DFA)
对状态图进行形式化,则可以下定义:
自动机 M 是一个五元式 M=(S, ∑, f, S0, F),其中:
a) S:
有穷状态集,
b) ∑:
输入字母表(有穷),
c) f:
状态转换函数,为 S⨯∑→S 的单值部分映射,f(s,a)=s’表示:
当现行状态为 s,输入字符为 a 时,将状态转换到下一状态 s’。
我
们把 s’称为 s 的一个后继状态。
d) S0∈S 是唯一的一个初态;
e) F⊆S :
终态集(可空)。
例如:
DFA M=({0,1,2,3},{a,b},f,0,{3}), 其中:
f 定义如下:
f(0,a)=1f(0,b)=2
f(1,a)=3f(1,b)=2
f(2,a)=1f(2,b)=3
f(3,a)=3f(3,b)=3
3.3.3 非确定有限自动机(NFA)
定义:
一个非确定有限自动机(NFA) M 是一个五元式 M=(S, ∑, f, S0, F),其中:
1 S:
有穷状态集;
2 ∑ :
输入字母表(有穷);
3 f:
状态转换函数,为 S⨯∑*→2S 的部分映射(非单值);
4 S0⊆S 是非空的初态集;
5 F ⊆S :
终态集(可空)。
从状态图中看 NFA 和 DFA 的区别:
1 弧上的标记可以是∑*中的一个字,而不一定是单个字符;
2 同一个字可能出现在同状态射出的多条弧上。
DFA 是 NFA 的特例。
定义:
对于任何两个有限自动机 M 和 M’,如果 L(M)=L(M’),则称 M 与 M’等价。
自动机理论中一个重要的结论:
判定两个自动机等价性的算法是存在的。
对于每个 NFA M 存在一个 DFA M’,使得 L(M)=L(M’)。
亦即 DFA 与 NFA 描述能力
相同。
把上述 NFA 确定化——采用子集法.
设 I 是 M’的状态集的一个子集,定义 I 的ε-闭包ε-closure(I)为:
i) 若 s∈I,则 s∈ε-closure(I);
ii) 若 s∈I,则从 s 出发经过任意条ε弧而能到达的任何状态 s’都属于ε-
closure(I)
即 ε-closure(I)=I⋃{s’|从某个 s∈I 出发经过任意条ε弧能到达 s’}
例:
设 a 是∑中的一个字符,定义 Ia= ε-closure(J)
其中,J 为 I 中的某个状态出发经过一条 a 弧而到达的状态集合。
3.3.4 正规文法与有限自动机的等价性
定理:
1.对每一个右线性正规文法 G 或左线性正规文法 G,都存在一个有限自动机(FA)
M,使得 L(M)=L(G)。
2.对每一个 FA M,都存在一个右线性正规文法 GR 和左线性正规文法 GL,使得 L(M)
=L(GR)=L(GL)。
3.3.5正规式与有限自动机的等价性
定理:
1. 对任何 FA M,都存在一个正规式 r,使得 L(r)=L(M)。
2. 对任何正规式 r,都存在一个 FA M,使得 L(M)=L(r)。
2 对转换图概念拓广,令每条弧可用一个正规式作标记。
(对一类输入符号)
3.3.6 确定有限自动机的化简
◆ 对 DFA M 的化简:
寻找一个状态数比 M 少的 DFA M’,使得 L(M)=L(M’)
◆ 假设 s 和 t 为 M 的两个状态,称 s 和 t 等价:
如果从状态 s 出发能读出某个字α而
停止于终态,那么同样,从 t 出发也能读出α而停止于终态;反之亦然。
◆ 两个状态不等价,则称它们是可区别的。
◆ 对一个 DFA M 最少化的基本思想:
把 M 的状态集划分为一些不相交的子集,使得任何两个不同子集的状态是可区别的,而
同一子集的任何两个状态是等价的。
最后,让每个子集选出一个代表,同时消去其他状
态。
I
(1)={0, 1, 2}I
(2)={3, 4, 5, 6}
Ia
(1) ={1, 3}
I(11) ={0, 2}I(12) ={1} I
(2)={3, 4, 5, 6}
I(11) ={0, 2}
Ia(11) ={1} Ib(11) ={2, 5}
I(111) ={0}I(112) ={2} I(12) ={1} I
(2)={3, 4, 5, 6}
Ia
(2) ={3, 6}Ia
(2) ={4, 5}
第四章 语法分析——自上而下分析
◆ 语法分析的方法:
◆ 自下而上分析法(Bottom-up)
◆ 自上而下分析法(Top-down)
◆ 基本思想:
它从文法的开始符号出发,反复使用各种产生式,寻找
"匹配"的推导。
◆ 递归下降分析法:
对每一语法变量(非终结符)构造一个相应的子程
序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和
联合作用实现对输入串的识别。
◆ 预测分析程序
☞ 优点:
直观、简单和宜于手工实现。
4.3 LL
(1)分析法
◆ 构造不带回溯的自上而下分析算法
◆ 要消除文法的左递归性
◆ 克服回溯
4.3.1 左递归的消除
◆ 直接消除见诸于产生式中的左递归:
假定关于非终结符 P 的规则为
P→Pα | β
其中β不以 P 开头。
我们可以把 P 的规则等价地改写为如下的非直接左递归形式:
P→βP'
P'→αP'|ε
◆ 一般而言,假定 P 关于的全部产生式是
左递归变右递归
P→Pα1 | Pα2 | … | Pαm | β1 | β2|…|βn
其中,每个α都不等于ε,每个β都不以 P 开头
那么,消除 P 的直接左递归性就是把这些规则改写成:
P→β1P' | β2P' | … | βnP'
P'→α1P' | α2P' |… | αmP' | ε
◆ 提取公共左因子:
假定关于 A 的规则是
A→δβ 1 | δβ 2 | …| δβ n | γ 1 | γ 2 | … | γm(其中,每个γ 不以δ开
头)
那么,可以把这些规则改写成
A→δA' | γ 1 | γ 2 | … | γ m
A'→β 1 | β 2 | … | β n
◆ 经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变
成为两两不相交。
4.3.3 LL
(1)分析条件
◆ 假定 S 是文法 G 的开始符号,对于 G 的任何非终结符 A,我们定义
*
FOLLOW(A) = {a | S ⇒ ...Aa...,a ∈ VT }
*
特别是,若 S ⇒∙ ∙ ∙ A ,则规定#∈FOLLOW(A)
⏹构造不带回溯的自上而下分析的文法条件
1. 文法不含左递归,
2. 对于文法中每一个非终结符 A 的各个产生式的候选首符集两两不相交。
即,若
A→α 1|α 2|…|α n
则 FIRST(α i)∩FIRST(α j)=φ(i≠j)
i=1,2,...,n
3. 对文法中的每个非终结符 A,若它存在某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=φ
如果一个文法 G 满足以上条件,则称该文法 G 为 LL
(1)文法。
第五章 语法分析——自下而上分析
语法分析的方法:
自下而上分析法(Bottom-up)
◆ 基本思想:
从输入串开始,逐步进行“归约”,直到文法的开始符
号。
即从树末端开始,构造语法树。
所谓归约,是指根据文法的产
生式规则,把产生式的右部替换成左部符号。
◆ 算符优先分析法:
按照算符的优先关系和结合性质进行语法分析。
适合分析表达式。
◆ LR 分析法:
规范归约
5.1.2规范归约
1.定义:
令 G 是一个文法,S 是文法的开始符号,假定αβδ是文法 G 的一个句型,
如果有
*+
且 S ⇒ αAδ , A ⇒ β
则称β是句型αβδ相对于非终结符 A 的短语。
特别是,如果有 A⇒β,则称β是句型αβδ相对于规则 A→ β的直接短语。
一个句型的
最左直接短语称为该句型的句柄。
2.归约
采用“移进-归约”思想进行自下而上分析。
基本思想:
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,
当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部
符号。
5.2 算符优先分析
◆ 四则运算的优先规则:
先乘除后加减,同级从左到右
◆ 考虑二义文法文法 G(E):
G(E):
E → i| E+E|E-E|E*E|E/E|(E)
◆ 它的句子有几种不同的规范规约。
◆ 归约即计算表达式的值。
归约顺序不同,则计算的顺序也不同,结果也不一样。
◆ 如果规定算符的优先次序,并按这种规定进行归约,则归约过程是唯一的。
◆ 起决定作用的是相邻的两个算符之间的优先关系。
◆ 所谓算符优先分析法就是定义算符之间的某种优先关系,借助于这种关系寻找“可
归约串”和进行归约。
5.2.1 算符优先文法及优先表构造
◆ 一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含
如下形式的产生式右部:
…QR…
则我们称该文法为算符文法。
◆ 约定:
◆ a、b 代表任意终结符;
◆ P、Q、R 代表任意非终结符;
◆ ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
◆ 假定 G 是一个不含ε-产生式的算符文法。
对于任何一对终结符 a、b,我们说:
1. a=b当且仅当文法 G 中含有形如 P→…ab…或 P→…aQb…的产生式;
++
2. a
++
3. a>b当且仅当 G 中含有形如 P→…Rb…的产生式,而 R ⇒ …a 或 R ⇒ …aQ。
⏹如果一个算符文法 G 中的任何终结符对(a,b)至多只满足下述三关系之一:
a=b,
ab。
则称 G 是一个算符优先文法。
◆ 从算符优先文法 G 构造优先关系表的算法。
◆ 通过检查 G 的每个产生式的每个候选式,可找出所有满足 a=b 的终结符对。
◆ 确定满足关系<和>的所有终结符对:
◆ 首先需要对 G 的每个非终结符 P 构造两个集合 FIRSTVT(P)和 LASTVT(P):
++
FIRSTVT (P) = {a | P ⇒ a ∙ ∙∙, P ⇒ Qa ∙ ∙∙, a ∈VT Q ∈VN }
++
a
++
LASTVT(P ) = {a | P ⇒∙ ∙ ∙ a 或P ⇒∙ ∙ ∙ aQ ,a ∈ VT 而Q ∈ VN }
++
a>b当且仅当 G 中含有形如 P→…Rb…的产生式,而 R ⇒ …a 或 R ⇒ …aQ。
❑ 有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<和>的所
有终结符对。
Ø 假定有个产生式的一个候选形为…aP…
那么,对任何 b∈FIRSTVT(P),有 a
Ø 假定有个产生式的一个候选形为…Pb…
那么,对任何 a∈LASTVT(P),有 a>b。
◆ 按其定义,可用下面两条规则来构造集合 FIRSTVT(P):
1. 若有产生式 P→a…或 P→Qa…,则 a∈FIRSTVT(P);
2. 若 a∈FIRSTVT(Q),且有产生式 P→Q…,则 a∈FIRSTVT(P)。
练习:
P133-2
① 计算它的 FIRSTVT 和 LASTVT;
② 计算 G 的优先关系 。
并确定 G 是否是一个算符优先文法?
◆ LR 分析方法:
把"历史"及"展望"综合抽象成状态;由栈顶的状态和现行的输入符
号唯一确定每一步工作
◆ LR 分析器的核心是一张分析表:
◆ ACTION[s,a]:
当状态 s 面临输入符号 a 时,应采取什么动作.
◆ GOTO[s,X]:
状态 s 面对文法符号 X 时,下一状态是什么
◆ 文法 G 的每个产生式的右部添加一个圆点称为 G 的 LR(0)项目
例:
如:
A→XYZ 有四个项目:
A→.XYZA→X.YZA→XY.ZA→XYZ.
☞ A→α . 称为"归约项目"
☞ 归约项目 S’→α . 称为"接受项目"
☞ A→α .aβ (a∈VT) 称为"移进项目"
☞A→α .Bβ (B∈VN) 称为"待约项目".
例:
文法 G(S')
S'→EE→aA|bBA→cA|d B→cB|d
该文法的项目有:
1.S'→·E2.S'→E·3.E→·aA4.E→a·A5.E→aA·
6.A→·cA7.A→c·A8.A→cA·9.A→·d10.A→d·
11.E→·bB12.E→b·B13.E→bB· 14.B→·cB15.B→c·B
16.B→cB·17.B→·d18.B→d·
◆ 构造识别文法所有活前缀的 NFA 方法
1. 若状态 i 为 X→X1 … Xi-1.Xi … Xn ,状态 j 为 X→X1 … Xi-1Xi .Xi+1 …
Xn ,则从状态 i 画一条标志为 Xi 的有向边到状态 j;
2. 若状态 i 为 X→α .Aβ ,A 为非终结符,则从状态 i 画一条ε边到所有状态
A→.γ。
◆ 把识别文法所有活前缀的 NFA 确定化。
◆ 构成识别一个文法活前缀的 DFA 的项目集(状态)的全体称为文法的 LR(0)项目集规
范族。
LR(0)分析表的构造
◆ 假若一个文法 G 的拓广文法 G'的活前缀识别自动机中的每个状态(项目集)不存在下
述情况:
1) 既含移进项目又含归约项目,
2) 含有多个归约项目
则称 G 是一个 LR(0)文法。
◆ 分析表的 ACTION 和 GOTO 子表构造方法:
1. 若项目 A→α·aβ属于 Ik 且 GO(Ik, a)=Ij,a 为终结符,则置 ACTION[k,a] 为
“sj”。
2. 若项目 A→α·属于 Ik,那么,对任何终结符 a(或结束符#),置 ACTION[k,a]为
“rj”(假定产生式 A→α是文法 G'的第 j 个产生式)。
3. 若项目 S'→S·属于 Ik,则置 ACTION[k,#]为 “acc”。
4. 若 GO(Ik,A)=Ij,A 为非终结符,则置 GOTO[k,A]=j。
5. 分析表中凡不能用规则 1 至 4 填入信息的空白格均置上“报错标志”。
◆ 按上述方法构造出的 ACTION 与 GOTO 表如果不含多重入口,则称该文法为 SLR
(1)
文法。
◆ 使用 SLR 表的分析器叫做一个 SLR 分析器。
◆ 每个 SLR
(1)文法都是无二义的。
但也存在许多无二义文法不是 SLR
(1)的.
I1、I2 和 I9 都含有“移进-归约”冲突。
FOLLOW(E)={#, ), +},
5.3.4 规范 LR 分析表的构造
◆ 我们需要重新定义项目,使得每个项目都附带有 k 个终结符。
每个项目的一般形式
是[A→α·β, a1a2…ak] ,这样的一个项目称为一个 LR(k)项目。
项目中的
a1a2…ak 称为它的向前搜索符串(或展望串)。
◆ 向前搜索符串仅对归约项目[A→α·,a1a2…ak]有意义。
对于任何移进或待约项目
[A→α·β, a1a2…ak], β≠ε,搜索符串 a1a2…ak 没有作用。
按上述算法构造的分析表,若不存在多重定义的入口(即,动作冲突)的情形,则称它
是文法 G 的一张规范的 LR
(1)分析表。
使用这种分析表的分析器叫做一个规范的 LR 分析器。
具有规范的 LR
(1)分析表的文法称为一个 LR
(1)文法。
LR
(1)状态比 SLR 多,LR(0)⊂SLR ⊂ LR
(1) ⊂无二义文法。
第六章 属性文法和语法制导翻译
6.1 属性文法
◆ 属性文法(也称属性翻译文法)
◆ 在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备
若干相关的“值”(称为属性)。
◆ 属性代表与文法符