编译原理复习.docx
《编译原理复习.docx》由会员分享,可在线阅读,更多相关《编译原理复习.docx(22页珍藏版)》请在冰豆网上搜索。
![编译原理复习.docx](https://file1.bdocx.com/fileroot1/2022-11/16/06cc40de-c631-404f-bab1-784aff1423f1/06cc40de-c631-404f-bab1-784aff1423f11.gif)
编译原理复习
1已知有限自动机如图
0.1
(1)以上状态转换图表示的语言有什么特征
(2)写出其正规式.
(3)构造识别该语言的确定有限自动机DFA.
[答案]
(1)至少含有两个连续的1的0,1组合
⑵(0I1)*11(0I1)*
⑶
0
1
A
A
AB
AB
A
ABC
ABC
AC
ABC
AC
AC
ABC
重新命名,令AB为B、ABC为C、AC为D
0
1
A
A
B
B
A
C
C
D
C
D
D
C
DFA:
2.试构造与下列文法G[S]等价的无左递归文法
G[S]:
S—SalNbIc
N—SdINeIf
[答案]
S—SaINbIc
N—NeISdIf
消除N—NeISdIf左递归:
N—SdNIfN'③
N—eN‘I£④
代入S—SaINbIc:
S—SaISdNbfNbc
消除S—SaISdNbIfN^blc左递归:
S—fN‘bS'lcS①
3.考虑下面文法G1:
S—aIAI(T)
T—T,SIS
消去G1的左递归。
然后对每一个终结符,写出不带回溯的递归子程序。
[答案]
S—aIAI(T)
T—ST'
T,ST'I&
Voidmatch(tokent)
{if(lookahead==t)
lookahead=nexttoken;
elseerror();}
voidS()
{if(lookahead=='a')match(‘a');
elseif(lookahead==A'
match(‘'
elseif(lookahead=='(')
{match(‘(');
T();
if(lookahead==')')match(‘)');
elseerror();}
elseerror();}voidT(){S();
T'();}
voidT'()
{if(lookahead==',')
{match(‘,');
S();
T'();}}
4.设有以下文法:
G[S]:
S—eEfGh|g
LFSG|h
F—SEc|cG|&
G^Sh|&
(1)求出该文法每一个非终结符的FOLLOW集。
(2)它是LL
(1)文法吗?
为什么?
[答案]
(1)
FIRST(S)={e,g}
FIRST(E)={h,c,e,g,}
FIRST(F)={c,e,g,&
FIRST(G)={e,g,&
FOLLOW(S)={#,e,g,h,c,f}
FOLLOW(E)={f,c}
FOLLOW(F)={e,g}
FOLLOW(G)={h,f,c,e,g}
(2)
e
f
g
h
c
#
S
SteEfGh
STg
E
Etfsg
Et£SG
Etfsg
Erh
Erfsg
Et£sg
F
FtSEc
FtSEc
FtcG
Ft£
Ft£
G
G^Sh
G^s
ASh
G^e
G^e
G^S
G^e
不是LL
(1)文法
5.设有文法:
G[S]:
StaBc|bAB
AtaAb|b
Btb|£
构造其LL
(1)分析表,并分析符号串baabbb是否是该文法的句子
[答案]
FIRST(S)={a,b}
FIRST(A)={a,b}
FOLLOW(S)={#}
FOLLOW(A)={b,#}
FIRST(B)={b,&FOLLOW(B)={c,#}
a
b
c
#
S
StaBc
StbAB
A
AtaAb
Atb
B
Btb
Bt£
Bt£
步骤
下推栈
输入串
动作
查分析表
1
#S
baabbb#
pop(S),push(bAB)
StbAB
2
#BAb
baabbb#
pop(b),next(ip)
匹配b
3
#BA
aabbb#
pop(A),push(aAb)
AtaAb
4
#BbAa
aabbb#
pop(a),next(ip)
匹配a
5
#BbA
abbb#
pop(A),push(aAb)
AtaAb
6
#BbbAa
abbb#
pop(a),next(ip)
匹配a
7
#BbbA
bbb#
pop(A),push(b)
Atb
8
#Bbbb
bbb#
pop(b),next(ip)
匹配b
9
#Bbb
bb#
pop(b),next(ip)
匹配b
10
#Bb
b#
pop(b),next(ip)
匹配b
11
#B
#
pop(B)
Bt£
12
#
#
正确结束
所以符号串baabbb是该文法的句子
6.下面文法是否是LL
(1)文法,说明理由
(1)S^Ab
2a|B|£
B^b|£
(2)S^aSe|B
B^bBe|C
SaCe|d
7.对下列文法G:
S'—S
P—S|i
S—D(R)
D—i
R—R;P|P
求出每个非终结符的FIRSTVT集和LASTVT集,并构造算符优先
关系表。
FIRSTVT(S')={(,i}
FIRSTVT(P)={i,(}
LASTVT(S')={)}
LASTVT(P)={),i}
i
7
(
)
#
i
>
>
>
<
>
<
>
(
<
<
<
=
):
>
>
>
#
<
<
=
LASTVT(R)={;,),i}
FIRSTVT(R)={;,i,(}
8.有文法G[S]:
SV
VT|ViT
TF|T+F
F)V*|(
(1)给出(+(i(的规范推导。
⑵指出句型F+Fi(的短语,句柄,素短语。
(3)G[S]是否为算符优先文法?
若是,给出
(1)中句子的分析过程
[答案]
(1)S=>V=>ViT=>ViF=>Vi(=>Ti(=>T+Fi(=>T+(i(=>F+(i(=>(+(i(
⑵句型F+Fi(的语法树:
TF
/IXI
T+F(
I
F
短语:
F,F+F,(,F+Fi(
句柄:
F
素短语:
(,F+F
(3)FIRSTVT禾口LASTVT
FIRSTVT
LASTVT
S
i,+,),(
i,+,*,(
V
i,+,),(
i,+,*,(
T
+,),(
+,(,*
F
),(,
*,(
(2)算符优先关系
i
+
*
(
)
#
i
>
<
>
<
<
>
+
>
>
>
<
<
>
*
>
>
>
>
(
>
>
>
>
)
<
<
<
<
#
<
<
<
<
三
因为任意两个终结符的优先关系唯一,所以该文法为算符优先文法
(3)(+(i(的分析过程
步骤
下推栈
输入串
动作
1
#
(+(i(#
#<(
移进
2
#(
+(i(#
(>+
归约F(
3
#F
+(i(#
#<+
移进
4
#F+
(i(#
+<(
移进
5
#F+(
i(#
(>i
归约F(
6
#F+F
i(#
+>i
归约TT+F
7
#T
i(#
#
移进
8
#Ti
(#
i<(
移进
9
#Ti(
#
(>#
归约F(
10
#TiF
#
i>#
归约VViT
11
#V
#
#=#
接受
9.设文法G(S)
S'—A
A—aA|b
构造识别文法G(S的所有活前缀的DFA.
[答案]
10=closure({Si.A})
10:
S'—.A
A—.aA
A—.b
11=closure(goto(IO,A))
I1:
S'—A.
12=closure(goto(I0,a))
I2:
A—a.A
A—.aA
A—.b
13=closure(goto(I0,b))
I3:
A—b.
14=closure(goto(I2,A))I4:
A—aA.closure(goto(I2,a))=I2closure(goto(I2,b))=I3
10.设文法G,试构造G的LR(0)分析表
G:
(1)S—CC
(2)C—cC
(3)C—d
[答案]
拓广为:
S—S
S—CC
C—cC
C—d
10=closure({S—・S})
10:
S'—・S
S—・CC
C—・cC
11=closure(goto(IO,S))
I1:
S'—S・
I2=closure(goto(I0,C))
I2:
S—C.C
C—.cC
C—.d
I3=closure(goto(I0,c))
I3:
C—c.C
C—.cC
C—.d
14=closure(goto(I0,d))I4:
C—d.
15=closure(goto(I2,C))I5:
S—CC.
closure(goto(I2,c)片I3closure(goto(I2,d))=I4
16=closure(goto(I3,C))I6:
C—cC.
closure(goto(I3,c)片I3closure(goto(I3,d))=I4
状
态
action
goto
c
d
#
S
C
0
S3
S4
1
2
1
acc
2
S3
S4
5
3
S3
S4
6
4
r3
r3
r3
5
r1
r1
r1
6
r2
r2
r2
11.对于文法A-aA|a构造SLR
(1)分析表
[答案]
(1)A—aA
(2)A—a
拓广为:
A'ta
AtaA
Ata
10=closure({A‘T.a})
I0:
A't.A
At.aA
At.a
11=closure(goto(IO,A))
I1:
A'tA.
12=closure(goto(I0,a))
I2:
Ata.A
At.aA
At.a
Ata.
13=closure(goto(I2,A))
I3:
AtaA.
closure(