19得票4回答
为什么LL文法不能是左递归的?

在龙书中,LL语法的定义如下: 如果对于任何产生式A -> a|b,满足以下两个条件,则该文法是LL文法。 1. FIRST(a)和FIRST(b)不相交。这意味着它们不能同时推导EMPTY。 2. 如果b能够推导EMPTY,则a不能推导以FOLLOW(A)开头的字符串,即FIRST(a)...

18得票1回答
哪些文法可以使用递归下降算法而不需要回溯进行解析?

根据维基百科上的"递归下降分析器",不使用回溯的递归下降分析(即预测分析)仅适用于LL(k)文法。 在其他地方,我读到Lua的实现使用了这样的解析器。然而,该语言并不是LL(k)。事实上,Lua本质上是有歧义的: a = f(g)(h)[i] = 1 的意思是 a = f(g); (h)[i...

18得票2回答
解析器的性能:PEG vs LALR(1)或LL(k)

我看到有些说法声称一般情况下,优化的PEG解析器无法比优化的LALR(1)或LL(k)解析器更快。(当然,解析性能取决于特定语法。) 我想知道是否存在任何PEG解析器的特定限制,无论是普遍有效还是针对某些PEG语法子集,这些限制会使它们在性能方面劣于LALR(1)或LL(k)。 尤其是,我...

16得票7回答
LL解析器与LR解析器的限制?

我知道LL和LR解析器的基本区别,也知道GLR、SLR和LALR都是LR解析器的扩展。那么更具体地说,在给定一个LL(*)解析器和任何一种LR解析器的变体的情况下,是否存在一种语言可以用其中一种而不是另一种来描述?或者更简单地说,是否存在任何功能或属性无法用两者之一来表达? 以一个具体的例子...

14得票1回答
如何确定一种语言是否为LL(1)语言?

我有一份语法,并能够检查它是否为LL(1)语法。但是,有没有办法检查由该语法生成的语言是否为LL(1)语言?LL(1)语法和LL(1)语言之间到底有什么区别?

13得票1回答
如何构建LL(k>1)的解析表?

在网络上,有很多例子展示如何从LL(1)分析器的first/follow集构造上下文无关文法的解析表。 但是我没有找到与k>1情况有关的有用信息。即使维基百科也没有相关信息。 我预计它在某种程度上类似,但指向这个领域现有研究的提示将非常有帮助。

9得票2回答
如何手动构建抽象语法树(AST)?

我目前正在学习解析,但我有点困惑如何生成AST。我已经编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合规范时它是静默的,不符合时会引发异常)。从这里开始,我该怎么建立AST呢?我找到了很多关于构建LL(1)解析器的信息,但几乎没有关于如何继续构建AST的信息。 我的当前代码(用...

8得票1回答
LR(0)、LL(0)、LALR(1)等之间的关系是什么?

我真的很难理解以下几种语法之间的关系: LR(0) LL(0) LALR(1) SLR(1) LR(1) LL(1) 我相信LALR(1)和SLR(1)是LR(1)的子集,但我对其他的不太清楚。它们是否都是互斥的?LL(0)是LL(1)的子集吗? 谢谢

8得票2回答
ANTLR:回溯和向前查看之间有什么区别?

我是一个相对新手,对于ANTLR不是很熟悉。我有一个非常简单的语法: start : ('A' 'B' 'C' '1' |'A' 'B' 'C' '2' |'A' 'B' 'C' '3' ) ; 我认为我已经理解了向前和回溯的概念基础(这与语法谓词一起工作)。所以,该语法适用于k=...

8得票2回答
用堆栈实现LL(1)解析器: 如何构建AST?

我目前正在手动构建解析器。这是一个LL(1)解析器。目前,它是一个很好的识别器:它的函数parse(List tokens)决定tokens是否属于该语言。 现在,我想为该输入构建相应的AST。然而,我知道如何以递归下降的方式实现它(已经完成)。也就是说,在这个挑战中,我使用经典算法的堆栈来...