《编译原理》重点知识总结.docx
《《编译原理》重点知识总结.docx》由会员分享,可在线阅读,更多相关《《编译原理》重点知识总结.docx(18页珍藏版)》请在冰豆网上搜索。
《编译原理》重点知识总结
《编译原理》知识点总结
第1章引论
第2章高级语言及其语法描述
第3章语法分析——自上而下分析
第4章属性文法和语法制导翻译
第5章语义分析和中间代码产生
第6章优化
第一章引论
一.编译程序(compiler):
把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序
二.编译程序的工作的五个阶段:
词法分析、语法分析、中间代码产生、优化、目标代码产生
1.词法分析
任务:
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。
依循的原则:
构词规则
描述工具:
有限自动机
FORI:
=1TO100DO
保留字标识符等符整常数保留字整常数保留字
2.语法分析
任务:
在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。
依循的原则:
语法规则
述工具:
上下文无关文法
3.语义分析与中间代码产生
任务:
对各类不同语法范畴按语言的语义进行初步翻译。
(变量是否定义、类型是否正确等)
依循的原则:
语义规则
中间代码:
三元式,四元式,逆波兰记号,树形结构等。
是一种独立于具体硬件的记号系统。
例:
将Z:
=X+*Y翻译成四元式为
(1)*YT1
(2)+XT1T2
(3):
=T2_Z
4.优化
任务:
对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:
程序的等价变换规则
FORK:
=1TO100DO
BEGIN
M:
=I+10*K;
N:
=J+10*K;
END
4.目标代码产生
任务:
把中间代码变换成特定机器上的目标代码。
依赖于硬件系统结构和机器指令的含义
目标代码三种形式:
a)绝对指令代码:
可直接运行
b)可重新定位指令代码:
需要连接装配
c)汇编指令代码:
需要进行汇编
第二章高级语言及其语法描述
语法
词法规则:
单词符号的形成规则。
a)单词符号是语言中具有独立意义的最基本结构。
一般包括:
常数、标识符、基本字、算符、界符等。
b)描述工具:
正规式和有限自动机
语法规则:
语法单位的形成规则。
a)语法单位通常包括:
表达式、语句、分程序、过程、函数、程序等;
c)描述工具:
上下文无关文法
语义
语义:
一组规则,用它可以定义一个程序的意义。
描述方法:
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&bV}
例如:
设:
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型(短语文法,图灵机):
产生式形如:
其中:
(VTVN)*且至少含有一个非终结符;(VTVN)*
任何0型语言都是递归可枚举的。
j)1型(上下文有关文法,线性界限自动机):
产生式形如:
其中:
||||,仅S例外。
意味着对非终结符进行替换时务必考虑上下文,并且,一般不允许替换成空串。
k)2型(上下文无关文法,非确定下推自动机):
产生式形如:
A
其中:
AVN;(VTVN)*。
非终结符的替换可以不必考虑上下文。
l)3型(正规文法,有限自动机):
产生式形如:
AB或A
其中:
VT*;A,BVN
产生式形如:
AB或A
其中:
VT*;A,BVN
正规文法的能力要比上下文无关文法弱得多。
四种类型描述能力比较
m)上下文无关文法的定义:
一个上下文无关文法G是一个四元式
G=(VT,VN,S,P),其中
VT:
终结符集合(非空)
VN:
非终结符集合(非空),且VTVN=
S:
文法的开始符号,SVN
P:
产生式集合(有限),每个产生式形式为
P,PVN,(VTVN)*
开始符S至少必须在某个产生式的左部出现一次。
例:
文法G1(A):
Ac|Ab
G1(A)的语言
解:
L(G1)={c,cb,cbb,},以c开头,后继若干个b
n)定义:
如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法是二义的。
G(E):
Ei|E+E|E*E|(E)是二义文法。
o)语言的二义性:
一个语言是二义性的,如果对它不存在无二义性的文法。
可能存在G和G’,一个为二义的,一个为无二义的。
但L(G)=L(G’)
2.状态转换图
a)概念:
状态转换图是一张有限方向图。
b)结点代表状态,用圆圈表示。
c)状态之间用箭弧连结,箭弧上的标记(字符)代表射出结状态下可能出现的输入字符或字符类。
d)一张转换图只包含有限个状态,其中有一个为初态,至少要有一个终态
3.正规运算符优先顺序
在不致混淆时,括号可以省去,但规定算符的优先顺序为:
*(闭包).(连接)|(或)
4.3型文法-正规式
G的任何产生式为AB或A
其中:
VT*;A,BVN
3型文法等价于正规式,所以也称正规文法。
确定有限自动机(DFA)
对状态图进行形式化,则可以下定义:
自动机M是一个五元式M=(S,,f,S0,F),其中:
a)S:
有穷状态集,
b):
输入字母表(有穷),
c)f:
状态转换函数,为SS的单值部分映射,f(s,a)=s’表示:
当现行状态为s,输入字符为a时,将状态转换到下一状态s’。
我们把s’称为s的一个后继状态。
d)S0S是唯一的一个初态;
e)FS:
终态集(可空)。
例如:
DFAM=({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
非确定有限自动机(NFA)
定义:
一个非确定有限自动机(NFA)M是一个五元式M=(S,,f,S0,F),其中:
1S:
有穷状态集;
2:
输入字母表(有穷);
3f:
状态转换函数,为S*2S的部分映射(非单值);
4S0S是非空的初态集;
5FS:
终态集(可空)。
从状态图中看NFA和DFA的区别:
1弧上的标记可以是*中的一个字,而不一定是单个字符;
2同一个字可能出现在同状态射出的多条弧上。
DFA是NFA的特例。
定义:
对于任何两个有限自动机M和M’,如果L(M)=L(M’),则称M与M’等价。
自动机理论中一个重要的结论:
判定两个自动机等价性的算法是存在的。
对于每个NFAM存在一个DFAM’,使得L(M)=L(M’)。
亦即DFA与NFA描述能力相同。
把上述NFA确定化——采用子集法.
设I是M’的状态集的一个子集,定义I的-闭包-closure(I)为:
i)若sI,则s-closure(I);
ii)若sI,则从s出发经过任意条弧而能到达的任何状态s’都属于-closure(I)
即-closure(I)=I{s’|从某个sI出发经过任意条弧能到达s’}
例:
设a是中的一个字符,定义Ia=-closure(J)
其中,J为I中的某个状态出发经过一条a弧而到达的状态集合。
正规文法与有限自动机的等价性
定理:
1.对每一个右线性正规文法G或左线性正规文法G,都存在一个有限自动机(FA)M,使得L(M)=L(G)。
2.对每一个FAM,都存在一个右线性正规文法GR和左线性正规文法GL,使得L(M)=L(GR)=L(GL)。
3.3.5正规式与有限自动机的等价性
定理:
1.对任何FAM,都存在一个正规式r,使得L(r)=L(M)。
2.对任何正规式r,都存在一个FAM,使得L(M)=L(r)。
对转换图概念拓广,令每条弧可用一个正规式作标记。
(对一类输入符号)
确定有限自动机的化简
对DFAM的化简:
寻找一个状态数比M少的DFAM’,使得L(M)=L(M’)
假设s和t为M的两个状态,称s和t等价:
如果从状态s出发能读出某个字而停止于终态,那么同样,从t出发也能读出而停止于终态;反之亦然。
两个状态不等价,则称它们是可区别的。
对一个DFAM最少化的基本思想:
把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)
基本思想:
它从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导。
递归下降分析法:
对每一语法变量(非终结符)构造一个相应的子程序,每个子程序识别一定的语法单位,通过子程序间的信息反馈和联合作用实现对输入串的识别。
预测分析程序
优点:
直观、简单和宜于手工实现。
LL
(1)分析法
构造不带回溯的自上而下分析算法
要消除文法的左递归性
克服回溯
左递归的消除
直接消除见诸于产生式中的左递归:
假定关于非终结符P的规则为
P→P|
其中不以P开头。
我们可以把P的规则等价地改写为如下的非直接左递归形式:
P→P
P→P|
一般而言,假定P关于的全部产生式是
P→P1|P2|…|Pm|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
经过反复提取左因子,就能够把每个非终结符(包括新引进者)的所有候选首符集变成为两两不相交。
LL
(1)分析条件
假定S是文法G的开始符号,对于G的任何非终结符A,我们定义
特别是,若
,则规定#FOLLOW(A)
构造不带回溯的自上而下分析的文法条件
1.文法不含左递归,
2.对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。
即,若A→1|2|…|n
则FIRST(i)∩FIRST(j)=(ij)
i=1,2,...,n
3.对文法中的每个非终结符A,若它存在某个候选首符集包含,则
FIRST(A)∩FOLLOW(A)=
如果一个文法G满足以上条件,则称该文法G为LL
(1)文法。
第四章语法分析——自下而上分析
语法分析的方法:
自下而上分析法(Bottom-up)
基本思想:
从输入串开始,逐步进行“归约”,直到文法的开始符号。
即从树末端开始,构造语法树。
所谓归约,是指根据文法的产生式规则,把产生式的右部替换成左部符号。
算符优先分析法:
按照算符的优先关系和结合性质进行语法分析。
适合分析表达式。
LR分析法:
规范归约
5.1.2规范归约
1.定义:
令G是一个文法,S是文法的开始符号,假定是文法G的一个句型,如果有
且
,
则称是句型相对于非终结符A的短语。
特别是,如果有A,则称是句型相对于规则A的直接短语。
一个句型的最左直接短语称为该句型的句柄。
2.归约
采用“移进-归约”思想进行自下而上分析。
基本思想:
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
算符优先分析
四则运算的优先规则:
先乘除后加减,同级从左到右
考虑二义文法文法G(E):
G(E):
Ei|E+E|E-E|E*E|E/E|(E)
它的句子有几种不同的规范规约。
归约即计算表达式的值。
归约顺序不同,则计算的顺序也不同,结果也不一样。
如果规定算符的优先次序,并按这种规定进行归约,则归约过程是唯一的。
起决定作用的是相邻的两个算符之间的优先关系。
所谓算符优先分析法就是定义算符之间的某种优先关系,借助于这种关系寻找“可归约串”和进行归约。
算符优先文法及优先表构造
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法。
约定:
a、b代表任意终结符;
P、Q、R代表任意非终结符;
‘…’代表由终结符和非终结符组成的任意序列,包括空字。
假定G是一个不含-产生式的算符文法。
对于任何一对终结符a、b,我们说:
1.a=b当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2.a
b…或R
Qb…;
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):
a
b…或R
Qb…;
a>b当且仅当G中含有形如P→…Rb…的产生式,而R
…a或R
…aQ。
有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<和>的所有终结符对。
假定有个产生式的一个候选形为…aP…
那么,对任何bFIRSTVT(P),有a
假定有个产生式的一个候选形为…Pb…
那么,对任何aLASTVT(P),有a>b。
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
1.若有产生式P→a…或P→Qa…,则aFIRSTVT(P);
2.若aFIRSTVT(Q),且有产生式P→Q…,则aFIRSTVT(P)。
练习:
P133-2
1计算它的FIRSTVT和LASTVT;
2计算G的优先关系。
并确定G是否是一个算符优先文法
LR分析方法:
把"历史"及"展望"综合抽象成状态;由栈顶的状态和现行的输入符号唯一确定每一步工作
LR分析器的核心是一张分析表:
ACTION[s,a]:
当状态s面临输入符号a时,应采取什么动作.
GOTO[s,X]:
状态s面对文法符号X时,下一状态是什么
文法G的每个产生式的右部添加一个圆点称为G的LR(0)项目
例:
如:
AXYZ有四个项目:
A.XYZAAAXYZ.
A.称为"归约项目"
归约项目S’.称为"接受项目"
A.a(aVT)称为"移进项目"
A.B(BVN)称为"待约项目".
例:
文法G(S)
S→EE→aA|bBA→cA|dB→cB|d
该文法的项目有:
→·E→E·→·aA→a·A→aA·
→·cA→c·A→cA·→·d→d·
→·bB→b·B→bB·→·cB→c·B→cB·→·d→d·
构造识别文法所有活前缀的NFA方法
1.若状态i为XX1……Xn,状态j为XX1…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)={#,),+},
规范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)SLRLR
(1)无二义文法。
第六章属性文法和语法制导翻译
属性文法
属性文法(也称属性翻译文法)
在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)。
属性代表与文法符号相关信息,如类型、值、代码序列、符号表内容等
属性可以进行计算和传递
语义规则:
对于文法的每个产生式都配备了一组属性的计算规则
属性
综合属性:
“自下而上”传递信息
继承属性:
“自上而下”传递信息
综合属性
在语法树中,一个结点的综合属性的值由其子结点的属性值确定。
使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值
仅仅使用综合属性的属性文法称S-属性文法
继承属性
在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
用继承属性来表示程序设计语言结构中的上下文依赖关系很方便
一遍扫描的处理方法
一遍扫描的处理方法是在语法分析的同时计算属性值
所采用的语法分析方法
属性的计算次序
L-属性文法适合于一遍扫描的自上而下分析
S-属性文法适合于一遍扫描的自下而上分析
L-属性文法和自顶向下翻译
通过深度优先的方法对语法树进行遍历,计算属性文法的所有属性值
LL
(1):
自上而下分析方法,深度优先建立语法树
第七章语义分析和中间代码产生
静态语义检查
类型检查
控制流检查
一致性检查
相关名字检查
名字的作用域分析
中间语言
常用的中间语言:
后缀式,逆波兰表示
图表示:
DAG、抽象语法树
三地址代码
三元式
四元式
间接三元式
逆波兰表示法不用括号。
只要知道每个算符的目数,对于后缀式,不论从哪一端进行扫描,都能对它进行唯一分解。
后缀式的计算
用一个栈实现。
一般的计算过程是:
自左至右扫描后缀式,每碰到运算量就把它推进栈。
每碰到k目运算符就把它作用于栈顶的k个项,并用运算结果代替这k个项。
布尔表达式的翻译
布尔表达式的两个基本作用:
用于逻辑演算,计算逻辑值;
用于控制语句的条件式.
产生布尔表达式的文法:
E→EorE|EandE|E|(E)|iropi|i
第十章优化
优化:
对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。
等价:
指不改变程序的运行结果。
有效:
指目标代码运行时间短,占用的存储空间小。
概述