我一直在使用lex / yacc,现在我正在尝试切换到ANTLR。主要关注的是ANTLR是一个LL(*)解析器,与yacc不同,它是LALR。我习惯于自下而上思考,我不知道LL语法的优点是什么。人们说LL语法现在更容易理解,更受欢迎。但似乎LR解析器更强大,例如LL解析器无法处理左递归,尽管似乎有一些解决方法。
所以问题是LL语法比LALR有什么优势?如果有人能给我一些例子,我会很感激。有用文章的链接也很棒。
提前感谢您的帮助!
(我认为这是一个很好的资源:What advantages do LL parsers have over LR parsers?,但通过一些例子可能会更好。)
答案 0 :(得分:11)
LR解析器比LL解析器更强大,此外,LALR解析器可以像LL解析器一样在O(n)中运行。所以你不会发现LL相对于LR的任何功能优势。
因此,LL的唯一优势是LR状态机相当复杂且难以理解,并且LR解析器本身并不是特别直观。另一方面,自动生成的LL解析器代码可以非常容易理解和调试。
答案 1 :(得分:9)
我看到LL解析器的最大优点是它们易于理解和实现!您可以使用与语法非常匹配的代码手写recursive descent解析器。
LR通常被认为更强大,也更快,但我知道有一些权衡:
然而,你会发现LL(*)也非常强大。