关于LL(1)文法的编译原理题目?

1.文法G[M]:
M→MaH|H
H→(M)|b(M)|b
(1) G[M]是否为LL(1)文法,为什么?
(2) 若G[M]不是LL(1)文法,对其进行改写,并判断改写后的文法是否满足LL(1)文法定义,若改写后的文法是LL(1)的,请构造其预测分析表。

判断是不是LL(1),首先看候选式的首字符有没有相同的,第二判断首字符迭代进去是否会构成左递归。
如果首字符不相同,也没用左递归就说明此文法是LL(1)
M→MaH|H
H→(M)|b(M)|b
第一个产生式中存在左递归:M->MaH
第二个产生式中存在首字符相同:H->b(M) ,
H->b
怎么改呢?
对第一个产生式,消除左递归就是要变成右递归,把右边剩下的符号提到前面:
M->aHM'

M'->aHM'
对第二个产生式,提出公共因子
H->b( (M)|ε)
=>
H->bH'

H'->(M)|ε
温馨提示:答案为网友推荐,仅供参考