LALR vs LL解析器

时间:2012-08-29 04:26:31

标签: parsing antlr yacc lalr ll

我一直在使用lex / yacc,现在我正在尝试切换到ANTLR。主要关注的是ANTLR是一个LL(*)解析器,与yacc不同,它是LALR。我习惯于自下而上思考,我不知道LL语法的优点是什么。人们说LL语法现在更容易理解,更受欢迎。但似乎LR解析器更强大,例如LL解析器无法处理左递归,尽管似乎有一些解决方法。

所以问题是LL语法比LALR有什么优势?如果有人能给我一些例子,我会很感激。有用文章的链接也很棒。

提前感谢您的帮助!

(我认为这是一个很好的资源:What advantages do LL parsers have over LR parsers?,但通过一些例子可能会更好。)

2 个答案:

答案 0 :(得分:11)

LR解析器比LL解析器更强大,此外,LALR解析器可以像LL解析器一样在O(n)中运行。所以你不会发现LL相对于LR的任何功能优势。

因此,LL的唯一优势是LR状态机相当复杂且难以理解,并且LR解析器本身并不是特别直观。另一方面,自动生成的LL解析器代码可以非常容易理解和调试。

答案 1 :(得分:9)

我看到LL解析器的最大优点是它们易于理解和实现!您可以使用与语法非常匹配的代码手写recursive descent解析器。

LR通常被认为更强大,也更快,但我知道有一些权衡:

  • LR解析器只能使用合成属性;他们无法传递继承的属性。
  • LR语法中的操作可能会导致语法不确定,但不会导致LL。

然而,你会发现LL(*)也非常强大。