G,a句柄:
G最左素短:
SdG
注:
还有一份试卷将句型改为adT<(S),与这个类似,大家自己做做,答案是
短语:
a,(S),T<(S),adT<(S)直接短语:
a,(S)句柄:
a最左素短语:
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、按指定类型给出下列语言的文法。
(10分)
(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>0}用正规文法。
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:
S→AB
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,5}
{1,2}
{3,4,Y}
{Y}
-
-
{1,2}
{1,2}
{Y}
{3,4,Y}
{5}
{Y}
{5}
-
{3,4}
{3,4}
{5}
{Y}
X
Ia
Ib
A
B
C
B
D
E
C
-
-
D
D
C
E
F
C
F
-
G
G
F
C
注:
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分)
a
b
S
A
B
A
A
C
B
Ф
E
C
D
E
D
Ф
F
E
Ф
Ф
F
D
E
NFA:
DFA:
Ia
Ib
{X,0,1,3}
{0,2,1,3}
{3,Y}
{0,2,1,3}
{0,2,1,3}
{1,3,Y}
{3,Y}
Ф
{Y}
{1,3,Y}
{2}
{Y}
{2}
Ф
{1,3}
{Y}
Ф
Ф
{1,3}
{2}
{Y}
含有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|
考题2:
写出文法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)分析表中没有填的空格代表出错,如果分析时遇到了代表该句子不符合该文法。
考题1:
判断下面文法是否为LL
(1)文法,若是,请构造相应的LL
(1)分析表并分析句子aabe的分析过程。
(15分)
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)
S
a
#b
D
εa
#b
T
b
e
M
b
e
H
εb
e
②将文法分解为:
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)分析表如下:
a
b
e
#
S
S→aD
D
D→STe
D→ε
D→ε
T
T→bM
M
M→bH
H
H→M
H→ε
(3)aabe的分析过程如下:
步骤
符号栈
输入串
所用产生式
0
#S
aabe#
1
#Da
aabe#
S→aD
2
#D
abe#
3
#eTS
abe#
D→STe
4
#eTDa
abe#
5
#eTD
be#
6
#eT
be#
D→ε
7
#eMb
be#
T→bM
8
#eM
e#
出错
考题2:
判断下面文法是不是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集合
非终结符X
First(X)
Follow(X)
S
a
#
H
a,d
#
M
a,e
d,b
A
a,e
b
求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)分析表如下:
a
d
b
e
S
S→aH
H
H→aMd
H→d
M
M→Ab
M→
M→
M→Ab
A
A→aM
A→e
aaabd#的分析过程如下:
步骤
符号栈
输入串
所用产生式
0
#S
aaabd#
1
#Ha
aaabd#
S→aH
2
#H
aabd#
3
#dMa
aabd#
H→aMd
4
#dM
abd#
5
#dbA
abd#
M→Ab
6
#dbMa
abd#
A→aM
7
#dbM
bd#
8
#db
bd#
M→
9
#d
d#
10
#
#