我在Internet上找不到关于LL(*)解析器的任何完整描述,例如ANTLR。
我想知道LL(k)解析器和LL(*)之间的区别是什么,以及为什么它们不能支持left-recusrive语法,尽管它们具有灵活性。
答案 0 :(得分:4)
这篇文章(由antlr的作者Terence Parr撰写)关于LL(*)
语法分析的文章:article有一个很好的例子,LL(*)
但不是LL(k)
{1}},适用于任何k
。
另一个很好的参考(更完整)是"Definitive ANTLR Reference",再次由Terence Parr和原始journal article描述antlr如何工作[pdf]。
答案 1 :(得分:1)
当你看到这一点时,通常会有一些令牌向前看以解析语言。
这与LR解析器相同。
因此k是裁决在做出决定之前将获取的最大令牌数。 请注意,除了使用生成器(ANTLR,yacc,bison,...)之外,k越多,解析器就越难。
LL解析器使用自顶向下方法,这意味着它将寻找最深的树。 因为左递归会产生一个不确定深度的树并且会破坏解析器。
AFAIK大部分语言都使用LR解析器。