【编译原理】第四章 自顶向下语法分析 题目解析

正因为炭治郎先生是这样温柔的人,我才希望他变得比任何人都要强。——《鬼灭之刃锻刀村篇》

  1. 已知文法G(S)如下:

(1) S→AB

(2)A→Ba |ε

(3)B →Db |D

(4)D→d|ε

问:
1)上述文法中能推出ε的非终结符号有(第1空)
S,A,B,D
A和D能直接推出ε,B能推出D间接推出ε,S能推出AB,当A推出ε,B推出ε时也能推出ε
2)若已知First(S)={a,d,b,ε},则First(A)= First(S)(第2空 填 是/否)?

S的第一个字符是A,A也是非终结符号,因此A的first集就是S的first集
3)First(D)比First(S)少(第3空)终结符号
a,b
First(D)={d,ε}
4)已知Follow(S)={#},则Follow(A)={第4空(仅需要填写其中的终结符号)}
b,d,#
A出现在S→AB,所以Follow(A)=First(B)={b,d,#}
Follow(B)={第5空(仅需要填写其中的终结符号)}
a,#
B出现在S→AB,A→Ba两处,所以Follow(B)={a,#}
5)Select(A→Ba)={ 第6空(仅需要填写其中的终结符号)}
b,d,a
Ba无法推出ε,所以Select(A→Ba)=First(Ba)={b,d,a}
Select(A→ε)={ 第7空(仅需要填写其中的终结符号)}
b,d,#
Select(A→ε)=Follow(A)={b,d,#}
Select(B→Db)={ 第8空(仅需要填写其中的终结符号)}
b,d
Db无法推出ε,所以Select(B→Db)=First(Db)={b,d}
Select(B→D)={ 第9空(仅需要填写其中的终结符号)}
a,d,#
D最终可以推出ε,所以Select(B→D)=First(D-#)+Follow(B)={a,d,#}
6)上述A,B的多个产生式右部的select()交集是Ø吗?所以该文法是LL(1)吗?(第10空(此处仅需填写是/否))

比较一下即可知

  1. 已知文法G(S)如下:

(1) S→ aAaB |bAbB

(2)A→ S |db

(3)B → bB |a

问:1)First(S)={第1空(仅需要填写其中的终结符号)}
a,b
第一个终结符号集合
First(A)={第2空(仅需要填写其中的终结符号)}
a,b,d
First(A)={First(S),d}
First(B)={第3空(仅需要填写其中的终结符号)}
a,b
第一个终结符号集合
3) Select(A→S)={ 第4空(仅需要填写其中的终结符号)}
a,b
S无法推出ε,所以Select(A→S)=First(S)=a,b
Select(A→db)={ 第5空(仅需要填写其中的终结符号)}
d
db无法推出ε,所以Select(A→db)=First(db)=d
上述两个select()交集是Ø吗?(第6空(此处仅需填写是/否))

4)若任意非终结符A的递归子程序用ParseA()表示,任意终结符a的语法分析语句是MatchToken(a),请补全下列递归下降子程序。

ParseA()
{ if (lookahead == (第7空))
a,b
第一种可能
{(第8空)}
ParseS()
匹配S的递归子程序
else if (lookahead == d)
{(第9空)
MatchToken(d)
匹配终结符号d
(第10空)
MatchToken(b)
匹配终结符号b}
else
{printf(“syntax is error!”)
exit(0)}
}

3、已知文法G(S)如下:

(1) S→ SaA |bB

(2)A→ aB |c

(3)B → Bb |d

问:1)该文法不是LL(1),原因是出现了(第1空)
左递归
S→ SaA |bB和B → Bb |d中出现了左递归
2)请将B的产生式进行修改,引入非终结符B’,修改后B→(第2空)
dB’
B’→ε|(第3空)
bB’
B → Bb |d,将不带递归的部分分离开,带递归的部分改写为B’→ε|bB’,B即带递归和不带递归的部分连接,B→dB’
3) Follow(S’)= {第4空(仅需要填写其中的终结符号)}
#
先改写S→ SaA |bB,S→ bBS’,S’→ε|aAS’,S’出现时后面没有符号,所以是#
Follow(B’)={ 第5空(仅需要填写其中的终结符号)}
a,#
将S→ bBS’改写为S→ bdB’|bdB’aAS’,可知Follow(B’)={a,#}
4)补全下列预测分析表(下列空中选择不同产生式的序号填写:1(→aB ) 2(→c) 3( →dB’) 4(→ε) 5(→bB’) 6(→ Bb) 7(→d))
在这里插入图片描述
6:1
输入a,对应A→aB
7:3
输入d,对应B→dB’
8:4
输入a,没有对应B’的结果,为ε
9:5
输入b,对应B’→bB’
10:4
输入#,对应B’→ε

4.已知文法G(S)如下:

(1)A→ aABe |a

(2)B→ Bb |d

问:1)该文法不是LL(1),原因是出现了(第1空(此处要写全呀!))
左递归,左公因子
A→ aABe |a有左公因子,B→ Bb |d有左递归
2)请将A的产生式进行修改,引入非终结符A’,修改后A→aA’, A’→(第2空)|ε
ABe
将a提取出来,A→ a(ABe |ε),A’→ABe |ε
请将B的产生式进行修改,引入非终结符B’,修改后B→(第3空)
dB’
B’→ε|(第4空)
bB’
B → Bb |d,将不带递归的部分分离开,带递归的部分改写为B’→ε|bB’,B即带递归和不带递归的部分连接,B→dB’
3)补全下列预测分析表(下列空中选择不同产生式的序号填写:
1 (→ε) 2(→ABe) 3(→bB’) 4 (→dB’) 5(→d) 6(→b))
在这里插入图片描述
5:2
输入a,A’→ABe(?不太理解 这里面没有a)
6:1
输入#,A’→ε
7:3
输入b,B’→bB’
8:1
输入e,B’没有对应输出,为ε
4) 该文法是LL(1)文法吗? (第9空 填写 是/否)

一开始不是,消除了左递归和左公因子以后就是了

————————————————————————————————————

如有问题请指正!!!!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值