是不是所有的文法都可以化为LL(1)文法?

来源:互联网 发布:仓库平面图制作软件 编辑:程序博客网 时间:2024/05/22 05:18

这个问题也是我想问的... 然后就搜到了这样的一个回答




提出一个问题:是不是所有的文法都可以化为LL(1)文法?

这个问题提得很好,说明该同学确实认真学习了本章内容,对没有讲到的问题进行了深入的思考。

 

应当指出,并非一切非LL(1)文法都能利用提取左因子的方法将它改造为LL(1)文法。例如,对于文法
S→AU|BR   A→aAU|b
B→aBR|b   U→c   R→d
对于S产生式,因有
FIRST(AU)∩FIRST(BR)={a,b}
故它不是一个LL(1)文法,为对S产生式的两个候选式提取左因子,可先将其中的非终结符号A,B分别用相应产生式的右部进行替换,我们得到
S→aAUU|bU|aBRR|bR
经提取左因子后,得到了与原文法等价的文法
S→aS′|bS″  S′→AUU|BRR    S″→U|R
A→aAU|b   B→aBR|b    U→c    R→d
显然,它仍不是一个LL(1)文法,且不难看出,无论将上述操作重复多少次都不能把它改造为LL(1)文法。
能由某一LL(1)文法产生的语言称为LL(1)语言。已经证明,LL(1)文法及LL(1)语言具有许多重要的特性。现不加证明地列举其中的一些主要结论如下:
(1) 任何LL(1)文法都是无二义性的;
(2) 左递归文法必然不是LL(1)文法;
(3) 存在一种算法,它能判断任意的文法是否为LL(1)文法;
(4) 存在一种算法,它能判定任意两个LL(1)文法是否产生相同的语言;
(5) 不存在这样的算法,它能判定任意的前后文无关语言是否为LL(1)语言;
(6) 非LL(1)语言 (即不能由任何LL(1)文法产生的前后文无关语言)是存在的。

0 0