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