编译原理期末复习Word文档下载推荐.docx
《编译原理期末复习Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理期末复习Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
产生式形式为:
,其中:
(VTVN)*且至少含有一个非终结符;
(VTVN)*
2)1型(上下文有关文法,线性界限自动机):
产生式形式为:
其中:
||||,仅S例外,但是S不得出现在任何产生式右部。
3)2型文法(上下文无关文法,非确定下推自动机):
P,PVN,(VTVN)*。
4)3型文法(正规文法,有限自动机):
右线性文法:
产生式形如:
AB或A其中:
VT*;
A,BVN左线性文法:
AB或A其中:
A,BVN
例题:
设G=(VT,VN,S,P)是一个上下文无关文法,产生集合P中的任一个产生式应具有什么样的形式?
若G是1型文法呢?
若G是正则文法呢?
上下文无关文法,产生式形式为:
1型文法:
正则文法:
A,BVN
左线性文法:
(8)什么是PDA(下推自动机)?
答:
PDA是下推自动机,PDAM用一个七元组表示(K,Σ,f,H,h0,S,Z)
K:
有穷状态集:
输入字母表(有穷)H:
下推栈符号的有穷字母表
h0:
H中的初始符号f:
K(Σ{})H–>
KH*S:
属于K是初始状态。
Z:
包含于K,是终结状态集合。
(9)什么是DFA(有穷状态自动机)?
自动机M是一个五元式M=(S,,f,S0,F),其中:
1)S:
有穷状态集,2):
输入字母表(有穷),
3)f:
状态转换函数,为SS的单值部分映射,f(s,a)=s’表示:
当现行状态为s,输入字符为a时,将状态转换到下一状态s’。
我们把s’称为s的一个后继状态。
4)S0S是唯一的一个初态;
5)FS:
终态集(可空)。
(10)推导:
所谓推导就是对于一个含非终结符A的符号串,利用规则A→α,把A替换成α得到新符号串的过程。
最左推导:
在推导的每一步,选择符号串最左边的非终结符进行替换。
最右推导:
在推导的每一步,选择符号串最右边的非终结符进行替换。
(11)归约:
归约是推倒的逆过程,即用产生式的左部非终结符替换右部符号串。
(12)什么是句型?
什么称为句子?
什么是语言?
句型:
从文法的起始符号出发,经过有限步的推导能够推导出来的符号称为句型。
句子:
只由终结符构成的句型称为句子。
语言:
所有句子的集合构成该文法描述的语言。
(13)什么是短语?
什么是直接短语(也称为简单短语)?
什么是句柄?
什么是素短语?
什么是最左素短语?
(以下几个概念一定要理解,考试中肯定会考哪些是短语,直接短语,句柄等,具体方法请参见后面的)
短语:
如果存在某个文法非终结符P,满足S
βPγ,并且P
α则称α为句型βαγ相对于非终结符P的短语。
直接短语:
如果Pα,即从P出发一步推出α,则α称为直接短语。
句柄:
一个句型的最左直接短语称为该句型的句柄。
素短语:
至少含有一个终结符的短语,并且除了自身外,不包含更小的素短语。
最左素短语:
句型中最左边的素短语。
(14)自顶向下的语法分析方法中需要解决的主要问题什么?
如何表示?
1)主要需要解决回溯和左递归问题。
2)表示方式,回溯:
文法中存在形如A→α1|α2|…|αn,即产生式右部存在多个候选,导致推导时不能确定到底应该选择哪个候选式。
左递归:
文法中存在形如P→Pα的形式,推导时会导致推导过程无休止的进行下去。
解决方法,对回溯采取的是提取左公因子,对左递归使消除左递归(包括直接左递归和间接左递归)。
(15)内情向量:
一般编译程序对数组说明的处理是把数组的有关信息汇集在一个叫做“内情向量”或“信息向量”的表格中,以便以后计算数组元素的地址时引用这些信息。
每个数组有一个内情向量。
其中的信息包括,数组的类型,维数,各维的上、下界,以及数组的首地址。
(16)C语言的活动记录:
2、最左最右推导,画语法树,找短语、直接短语、句柄等。
这种题目很简单,送分题,一定不能丢分!
考题:
1)文法G[S]为:
S→SdT|TT→T<
G|GG→(S)|a试给出句型(SdG)<
a的推导过程及语法树,并找出(SdG)<
a的短语,直接(简单)短语、句柄和最左素短语。
分析:
(1)推导和画语法树这些都很简单,不再赘述。
(2)根据所画出的语法树,可以很快的找出短语,直接短语,句柄和最左素短语等,先讲一个简单子树的概念,所谓简单子树是指仅具有单层分支的子树。
具体方法如下:
任一子树的树叶全体(具有共同祖先的叶节点符号串)皆为短语;
任一简单子树的树叶全体(具有共同父亲的叶节点符号串)皆为简单短语;
最左边的直接短语;
最左素短语:
最左边的素短语。
(1)STT<
GG<
G(S)<
G(SdT)<
G(SdG)<
a
语法树:
(2)短语:
G,SdG,(SdG),a,(SdG)<
a直接短语:
G,a句柄:
G最左素短:
SdG
注:
还有一份试卷将句型改为adT<
(S),与这个类似,大家自己做做,答案是
a,(S),T<
(S),adT<
(S)直接短语:
a,(S)句柄:
a最左素短语:
下面两道例题大家看看,一定要会找短语,直接短语,句柄等.
2)文法G[E]的产生式为E→E+T|TT→T*F|FF→i|(E)
①对于句型(i+i)*i,给出最左最右推导及相应的推导树
②列出句型的所有短语、简单短语。
(还有一份试卷上是出句型F+T*F的所有短语、简单短语和句柄,大家自己做做)
(1)最左推导:
ETT*FF*F(E)*F(E+T)*F(T+T)*F(F+T)*F(i+T)*F
(i+F)*F(i+i)*F(i+i)*i
最右推导ETT*FT*iF*i(E)*i(E+T)*i(E+F)*i(E+i)*i(T+i)*i
(F+i)*i(i+i)*i
推导树如下:
(2)短语;
i,i+i,(i+i),(i+i)*i直接短语:
i句柄:
i
3、根据语言推文法
这类题目首先要看清题目,指定的是什么文法,一般都是2型(上下无关文法)或者3型(正规文法),这两类文法形式一定要记住,具体请参见第2页的文法分类。
掌握几个基本形式{an|n>
0}对应文法S→aS|a如果是n>
=0则为S→aS|ε(ε是空字)
{anbn|n>
0}对应文法S→aSb|ab
下面这四道题目老是在试卷中重复出现,所以大家好好看看。
考题
1、按指定类型给出下列语言的文法,并指出语言的类型。
(10分)
(1)L1={anbmcn|n≥0,m>
0}
二型文法:
S→aSc|BB→bB|b
(2)L2={0na1nbmcm|n>
0,m≥0}
二型文法:
S→ABA→0A1|0a1B→bBc|ε
2、按指定类型给出下列语言的文法。
(1)L1={candbm|n≥0,m>
0}用正规文法。
S→cAA→aA|BB→dCC→bC|b
(2)L2={0na1nbmcm|n>
0,m≥0}用二型文法。
S→ABA→0A1|0a1B→bBc|ε
3、按指定的类型给出下列语言的文法(10分)
(1)L1={canbm|n≥0,m>
S→cAA→aA|BB→bB|b
(2)L2={0na1nbm|n>
0,m≥0}用二型文法。
S→ABA→0A1|0a1B→bB|ε
4、按指定的类型给出下列语言的文法(10分)
(1)L1={anbmc|n>
=0,m>
0}用正规文法
S→aS|AA→bA|bBB→c
(2)L2={a0n1nbdm|n>
0,m>
0}用二型文法
S→ABA→aTT→0T1|01
B→bDD→dD|d
这是书P36第11题的答案如下:
大家作为练习,可以发现比上述题目简单的多了。
G4:
S→1S0|A
A→0A1|ε
G3:
S→AB
A→aAb|ε
B→aAb|ε
G2:
A→aA|ε
B→bBc|bc
G1:
S→AC
A→aAb|ab
C→cC|ε
或者G4:
4、词法分析———正规式、NFA和DFA之间的转化:
(1)这类题目一般是三者之间的转换,正规式→NFA→确定化的DFA→最小化的DFA,有时已经给出NFA了,则只需要确定化为DFA和最小化就行了,一般每一步都是五分。
具体怎么转换请参照我期中考试时整理的提纲,主要就是下面这幅关系对照图,因时间和篇幅限制不再追溯。
(2)注意优先级关系,闭包运算*最高,连接运算.次之,或运算|最低。
(3)考题1:
1)构造正则式a*b|(ab)*b对应的DFA。
(15分)
①画出NFA
②确定化DFA
X
Ia
Ib
{X,1,2,3,4}
{1,2,5}
{Y}
{1,2}
{3,4,Y}
-
{5}
{3,4}
A
B
C
D
E
F
G
C和E是终态
③最小化DFA
首先将集合分为{A,B,D,F,G},{C,E}。
{A,B,D,G}都有a,b作为条件输出,F只有b输出,所以分为{A,B,D,G}和{F}同理{C,E}分为{C},{E}。
{A,B,D}a={B,D}{G}a={F}所以{A,B,D,G}分为{A,B,D}和{G}。
{A}b={C}{B,D}a={D}所以分为{A}{B,D}
综上所述:
划分的结果为{A},{B,D},{C},{E},{G}.
考题2:
将NFA确定化为DFA(10分)
b
S
Ф
NFA:
DFA:
{X,0,1,3}
{0,2,1,3}
{3,Y}
{1,3,Y}
{2}
{1,3}
含有Y的状态子集为DFA的终态,上例中的终态有B,C,E.
题目中要求是确定化,没有要求最小化,如若最小化,划分的集合为{S,A},{B,C}
{F},{D},{E}然后再画出最小化后的DFA这里不再赘述。
考题3:
构造奇数个0和奇数个1组成的自动机。
(10分)
状态1:
偶数个0偶数个1状态2:
奇数个0偶数个1
状态3:
奇数个0奇数个1状态4:
偶数个0奇数个1
如果题目改成偶数个0,奇数个1,只要将状态4转换成终态即可,其他类似。
5、语法分析——自顶向下分析法(LL
(1)分析法和递归向下构造子程序法)
自顶向下分析法本质是由开始符号,按照产生式逐步推导看能否产生需要分析的句子。
(1)自顶向下分析中存在的问题
左递归和回溯(具体请参见简答题中的第(14)题)
(2)消除回溯——提取公因子法
提取公共左因子:
假定关于A的规则A→1|2|…|n|1|2|…|m(其中,每个不以开头)那么,可以把这些规则改写成A→A|1|2|…|m
A→1|2|…|n
(3)消除左递归
1)消除直接左递归:
直接消除见诸于产生式中的左递归:
假定关于非终结符P的规则为P→P|,其中不以P开头。
我们可以把P的规则等价地改写为如下的非直接左递归形式:
P→PP→P|
一般而言,假定P关于的全部产生式是P→P1|P2|…|Pm|1|2|…|n
其中,每个都不等于,每个都不以P开头那么,消除P的直接左递归性就是把这些规则改写成:
P→1P|2P|…|nPP→1P|2P|…|mP|
例:
文法G(E):
E→E+T|TT→T*F|FF→(E)|i
经消去直接左递归后变成:
E→TEE→+TE|T→FTT→*FT|F→(E)|i
2)消除间接左递归
这个请参见我期中整理的提纲篇幅较多,这里不再重复赘述,请参照下面的考题2。
考题1:
将文法G[S]改写为等价的G’[S],使得G’[S]不含左递归和左公因子。
S→[AA→B]|ASB→aB|a
消除左递归和左公因子后的文法为:
S→[AA→B]A’A’→SA’|B→aB’B’→B|
写出文法G[A]:
A→Ba|Cb|cB→dA|Ae|fC→Bg|h消除左递归后的文法。
(1)经分析发现文法G[A]并无直接左递归;
(2)消除间接左递归:
将A,B,C按照B,C,A排序(建议将A放在最后)由于出现C→Bg形式,将B代入C得:
C→dAg|Aeg|fg|h又由于A出现A→BaA→Cb将B,C带入A得到:
A→dAa|Aea|fa|dAgb|Aegb|fgb|hb|c等价于A→Aea|Aegb|dAa|fa|dAgb|fgb|hb|c
将A消除直接左递归A→dAaA’|faA’|dAgbA’|fgbA’|hbA’|cA’A’→eaA’|egbA’|
此时,对于B→dA|Ae|f,C→dAg|Aeg|fg|h由于未在任何产生式的右部出现,所以是多余的。
综上所述:
消除递归后的文法为:
A→dAaA’|faA’|dAgbA’|fgbA’|hbA’|cA’
A’→eaA’|egbA’|
(4)LL
(1)分析法
1)含义:
LL
(1)分析方法(也叫预测分析法):
是指从左到右扫描、最左推导(LL)和只查看一个当前符号(括号中的1)。
2)判断一个文法是否是LL
(1)文法的充要条件:
1.文法不含左递归,
2.对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。
即,若
A→1|2|…|n则FIRST(i)∩FIRST(j)=(ij)
3.对文法中的每个非终结符A,若它存在某个候选首符集包含,则FIRST(i)∩FOLLOW(A)=i=1,2,...,n如果一个文法G满足以上条件,则称该文法G为LL
(1)文法。
(5)LL
(1)文法分析表的构造与运用
这类题目,主要就是判断文法是否满足LL
(1)文法的三个充要条件,分为以下几步:
1)首先将文法分解,判断是否有左递归好,有的话肯定不是LL
(1)文法;
2)算非终结符的First集合和Follow集合,具体方法请参见期中考试的提纲,其实最本质的要抓住first集合是U
a…,Follow集合石…Ua…即可。
3)算Select集合,书上没有提到Select集合,计算Select集合实质就是计算First(),当然考试时不一定非要写成Select集合形式,可以直接计算First()来判断交集是否为空,从而是否为LL
(1)文法,请看考题1。
4)至于判断一个句子的分析过程,大家注意一下,所给的句子不一定是能通过该文法分析出来的,实际上在分析之前可以自己根据文法推推看,请看考题1.
5)分析表中没有填的空格代表出错,如果分析时遇到了代表该句子不符合该文法。
判断下面文法是否为LL
(1)文法,若是,请构造相应的LL
(1)分析表并分析句子aabe的分析过程。
S→aDD→STe|εT→bMM→bHH→M|ε
判断一个文法是否为LL
(1)文法是否为LL
(1)文法,主要就是判断是否满足LL
(1)文法的充要条件,有一个不满足就不是LL
(1)文法。
对于aabe根据文法SaDaSTeaaDTeaaTeaabMe由于M不能为空字ε,所以最后肯定推不出来,也就是该句子不能由该文法推出,出错。
当然一般题目都是LL
(1)文法,否则题目就不好往下做,没有意义。
(1)经分析该文法无左递归;
(2)①非终结符的First和Follow集合如下表所示
非终结符X
First(X)
Follow(X)
#b
εa
T
e
M
H
εb
②将文法分解为:
S→aDD→SteD→εT→bMM→bHH→MH→ε
依次计算:
First(aD)={a}First(Ste)={a}
Follow(D)={#b}First(bM)={b}
First(bH)={b}First(M)={b}Follow(H)={e}
∵First(Ste)∩Follow(D)=ФFirst(M)∩Follow(H)=Ф
∴该文法是LL
(1)文法
LL
(1)分析表如下:
e
#
S→aD
D→STe
D→ε
T→bM
M→bH
H→M
H→ε
(3)aabe的分析过程如下:
步骤
符号栈
输入串
所用产生式
#S
aabe#
1
#Da
aabe#
2
#D
abe#
3
#eTS
4
#eTDa
5
#eTD
be#
6
#eT
7
#eMb
8
#eM
e#
出错
判断下面文法是不是LL
(1)文法,若是请构造相应的LL
(1)分析表,写出aaabd的分析过程。
S→aHH→aMd|dM→Ab|A→aM|e
(1)可以判断该文法无左递归。
(2)将文法分解为分解:
S→aHH→aMdH→dM→AbM→A→aMA→e
求First和Follow集合
a,d
a,e
d,b
a,e
求Select集合
Select(S→aH)=First(aH)={a}Select(H→aMd)=First(aMd)={a}
Select(H→d)={d}Select(M→Ab)=First(Ab)={a,e}
Select(M→)=First()UFollow(M)=Follow(M)={d,b}
Select(A→aM)=First{aM}={a}Select(A→e)=First(e)={e}
∵Select(H→aMd)∩Select(H→d)=Ф
Select(M→Ab)∩Select(M→e)=Ф
Select(A→aM)∩Select(A→e)=Ф
∴该文法是LL
(1)文法。
(3)LL
(1)分析表如下:
d
S→aH
H→aMd
H→d
M→Ab
M→
A→aM
A→e
aaabd#的分析过程如下:
aaabd#
#Ha
aaabd#
#H
aabd#
#dMa
#dM
abd#
#dbA
#dbMa
#dbM
bd#
#db
9
#d
d#
10
#