我在 Internet 上找不到任何关于 LL(*) 解析器(例如 ANTLR)的完整描述。
我想知道 LL(k) 解析器和 LL(*) 解析器之间有什么区别,以及为什么尽管它们具有灵活性,但它们仍不能支持左递归语法。
我在 Internet 上找不到任何关于 LL(*) 解析器(例如 ANTLR)的完整描述。
我想知道 LL(k) 解析器和 LL(*) 解析器之间有什么区别,以及为什么尽管它们具有灵活性,但它们仍不能支持左递归语法。
这是一篇关于语法分析的文章(由antlr的作者 Terence Parr 撰写):文章有一个很好的例子,说明什么是但不是,对于任何。LL(*)
LL(*)
LL(k)
k
另一个很好的参考资料(而且更完整)是 Terence Parr 的“权威 ANTLR 参考资料”,以及描述antlr如何工作的原始期刊文章[pdf]。
当您看到这一点时,通常会提前查看令牌的数量以解析语言。
这对于 LR 解析器也是一样的。
所以 k 是 parer 在做出决定之前将获取的最大令牌数量。请注意,k 越高,解析器就越难,除非您使用生成器(ANTLR,yacc,bison,...)。
LL 解析器使用自上而下的方法,这意味着它将寻找最深的树。因为左递归会生成一个无限深的树并且会破坏解析器。
AFAIK 大多数语言都使用 LR 解析器。