在龙书中,LL语法的定义如下: 如果对于任何产生式A -> a|b,满足以下两个条件,则该文法是LL文法。 1. FIRST(a)和FIRST(b)不相交。这意味着它们不能同时推导EMPTY。 2. 如果b能够推导EMPTY,则a不能推导以FOLLOW(A)开头的字符串,即FIRST(a)...
根据维基百科上的"递归下降分析器",不使用回溯的递归下降分析(即预测分析)仅适用于LL(k)文法。 在其他地方,我读到Lua的实现使用了这样的解析器。然而,该语言并不是LL(k)。事实上,Lua本质上是有歧义的: a = f(g)(h)[i] = 1 的意思是 a = f(g); (h)[i...
我看到有些说法声称一般情况下,优化的PEG解析器无法比优化的LALR(1)或LL(k)解析器更快。(当然,解析性能取决于特定语法。) 我想知道是否存在任何PEG解析器的特定限制,无论是普遍有效还是针对某些PEG语法子集,这些限制会使它们在性能方面劣于LALR(1)或LL(k)。 尤其是,我...
我知道LL和LR解析器的基本区别,也知道GLR、SLR和LALR都是LR解析器的扩展。那么更具体地说,在给定一个LL(*)解析器和任何一种LR解析器的变体的情况下,是否存在一种语言可以用其中一种而不是另一种来描述?或者更简单地说,是否存在任何功能或属性无法用两者之一来表达? 以一个具体的例子...
我有一份语法,并能够检查它是否为LL(1)语法。但是,有没有办法检查由该语法生成的语言是否为LL(1)语言?LL(1)语法和LL(1)语言之间到底有什么区别?
在网络上,有很多例子展示如何从LL(1)分析器的first/follow集构造上下文无关文法的解析表。 但是我没有找到与k>1情况有关的有用信息。即使维基百科也没有相关信息。 我预计它在某种程度上类似,但指向这个领域现有研究的提示将非常有帮助。
我目前正在学习解析,但我有点困惑如何生成AST。我已经编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合规范时它是静默的,不符合时会引发异常)。从这里开始,我该怎么建立AST呢?我找到了很多关于构建LL(1)解析器的信息,但几乎没有关于如何继续构建AST的信息。 我的当前代码(用...
我真的很难理解以下几种语法之间的关系: LR(0) LL(0) LALR(1) SLR(1) LR(1) LL(1) 我相信LALR(1)和SLR(1)是LR(1)的子集,但我对其他的不太清楚。它们是否都是互斥的?LL(0)是LL(1)的子集吗? 谢谢
我是一个相对新手,对于ANTLR不是很熟悉。我有一个非常简单的语法: start : ('A' 'B' 'C' '1' |'A' 'B' 'C' '2' |'A' 'B' 'C' '3' ) ; 我认为我已经理解了向前和回溯的概念基础(这与语法谓词一起工作)。所以,该语法适用于k=...
我目前正在手动构建解析器。这是一个LL(1)解析器。目前,它是一个很好的识别器:它的函数parse(List tokens)决定tokens是否属于该语言。 现在,我想为该输入构建相应的AST。然而,我知道如何以递归下降的方式实现它(已经完成)。也就是说,在这个挑战中,我使用经典算法的堆栈来...