LL语法分析器和LR语法分析器的比较

来源:互联网 发布:中世纪的生活 知乎 编辑:程序博客网 时间:2024/05/30 19:34

最近正在读久负盛名的“龙书”,读到了语法分析部分,有关编译器的语法分析部分,龙书主要讲了自顶向下的语法分析和自底向上的语法分析两类分析方法,自顶向下的语法分析主要对应于LL文法,而自底向上的语法分析主要对应于LR文法,这里不对文法的详细情况作讨论。本文主要讨论LL文法与LR文法各自的优缺点并总结我们应该在适当的时候应使用何种文法来设计语言或者是编译器。


以下从语法分析器编写的复杂度、语法普适性、错误恢复、分析表大小和分析速度这几个方面来比较。

1. 复杂度

复杂度是指语法分析器编写的复杂度。

这一项是LL语法分析器占优势,知道LL文法和LR文法的细节的人应该都能明白这一点。如果你亲自写过语法分析器,那么自顶向下的语法分析器(递归向下)的程序代码应该会更加的鲜明易懂,而自底向上的语法分析器代码就不这么容易看懂了,特别是当你看到LALR分析器的分析表时,一定会抓狂的:P。

2. 普适性

普适性是指该文法能够支持的上下文无关文法的数目。下图为上下文无关文法、LR文法和LL文法的关系:

这一点是LR文法完胜,LR文法能够支持更多上下文无关文法,因为当一个文法是LL文法的时候,那它一定也是LR文法。LL文法和LR文法的最大不同之处在于:对于LL文法,你得先对自己设计的语法进行提取左因子并且消除左递归,而LR文法更本不用考虑这一步,因为它很乐意接受带有左递归或者公共左因子的文法。
很多现有的计算机语言都已经有了LALR文法,而且你把LALR文法转换为LL文法也不是一件非常困难的事情(并不绝对)。

3. 错误恢复

由于LL类语法分析算法采用自顶向下的结构,而且经常是手工写出来的(LR语法分析器通常使用生成器来生成),而你在编写时,很容易控制语法的分析过程,比如程序代码中的是否漏写分号、花括号之类的,所以LL语法分析器有更好的上下文信息,因此它在错误恢复上更胜一筹。

4. 分析表大小

这里是LL文法更加占优势,如果你拿同一个语法的LL分析表和LR分析表来比较,那结果是显而易见的。

5. 分析速度

这一项没有定论,这取决于你的算法实现的优劣或者语法分析器生成工具。


从以上几点比较中,LL文法以其容易实现、易于控制等特点优于LR文法,但是这并不是绝对的,例如,当你设计的语言的上下文无关文法中存在着大量的左递归和公共左因子时,你就得耗费大量精力来修改文法以消除左递归和提取左因子,这反而不如LR文法简便,所以在实际开发中还得根据实际情况来选择。



参考文档:
1. http://programmers.stackexchange.com/questions/19541/what-are-the-main-advantages-and-disadvantages-of-ll-and-lr-parsing
2. http://stackoverflow.com/questions/2842809/lexers-vs-parsers/22307370
0 0
原创粉丝点击