问题标签 [lr1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
140 浏览

compiler-construction - LR(1) 表结构混乱

我对如何使用 LR(1) 解析这个语法感到困惑:

我知道存在左递归,但有人告诉我没有必要为 LR(1) 删除它。我的项目集如下所示:(逗号将语法与前瞻分开)

现在这是我感到困惑的地方:

我被告知要解析字符串“(())”。当我这样做时,我意识到状态 4 需要有一个右括号“)”作为前瞻,这是有道理的。现在我追溯了这一点,发现这个右括号最初应该来自项目集 2 中的第一个语句。

这将导致右括号被转移到接下来的 2 个状态,并且我的语法将完美解析。但是,我感到困惑的是,为什么这里应该有一个右括号?$( 不应该从项目集 1 结转。这个右括号是从哪里来的?有人可以解释一下。谢谢

0 投票
0 回答
83 浏览

parsing - LR(1) 解析,前瞻符号问题

我理解 LR(1) 解析和前瞻符号的概念。我有练习的解决方案,但它不同意我的解决方案。

我正在尝试为以下语法填充 LR(1) 解析表:

Ι 不必扩展语法,因为 S 不会出现在任何规则的任何右侧。

括号中的前瞻符号。

所以,I0 = Closure(S->.xAz($) , S->.BAx($) ) =

当我尝试GOTO(0,x)我认为我应该去:

查找 A-> 的前瞻符号。& A->. 是的,我首先选择(z)。但是官方书籍解决方案说前瞻是(z,y)。 y 是从哪里来的?

先感谢您

0 投票
1 回答
56 浏览

parsing - 计算语法的 FIRST & FOLLOW 集

我有以下语法:

我已经计算了这个语法的第一组和后一组,我想知道它是否正确。这是我的解决方案:

任何帮助表示赞赏。谢谢。

0 投票
1 回答
187 浏览

qml - QML 语法是 LALR(1) 吗?

这是一个 QML 语法(摘自https://github.com/kropp/intellij-qml/blob/master/grammars/qml.bnf):

是 LALR(1) 吗?我的程序为包含冲突项的闭包 I[n] 引发了减少/减少冲突:

0 投票
1 回答
147 浏览

parsing - LR(1) 解析器:为什么添加 epsilon 产生式会导致 r/r 或 s/r 冲突

我想制作一个阅读器,它可以读取类似于 mswin 的 INI 文件的配置文件。使用我制作的词法分析器/解析器生成器自学是为了锻炼。语法是:

问题在于@epsilon@生产。我添加它是因为我希望我的读者也接受空文件。但是当 'OptionsList' 或 'OptionGroup' 包含 epsilon 产生时,我会遇到冲突。我尝试重新排列作品中的元素,但我只会遇到冲突(r/r 或 s/r,取决于我所做的),除非我从语法中完全删除 epsilon。它消除了这个问题,但是......在我的逻辑中,“OptionsList”或“OptionGroup”之一应该包含一个 epsilon,否则我接受空文件的目标就不会实现。

我的解析器生成器使用 LR(1) 方法,所以我认为我可以在我的语法中使用 epsilon 产生式。看来我擅长编写生成器,但不擅长构建无错误的语法:(。

我应该忘记epsilons吗?或者即使没有 epsilon 产生,我的语法是否也接受空输入?

0 投票
1 回答
181 浏览

parsing - 为什么此语法在 LALR(1) 中有效,但在 LR(1) 中无效

总而言之,与 LALR(1) 相比,LR(1) 在各方面都应该更强大,因为 LR(1) 构建了 LR(1) 项的规范集合,而 LALR(1) 只是一个更好的 SLR(1)解析器。

那么当我尝试这个输入时,为什么这个语法在 LALR(1) 解析器中成功运行,但在 LR(1) 解析器中却没有:

int + int

对于这个语法:

这些是我用于此示例的 JavaScript LR(1) 和 JavaScript LALR(1) 解析器:http: //jsmachines.sourceforge.net/machines/lr1.html

http://jsmachines.sourceforge.net/machines/lalr1.html

更新

JSmachine 网站有很多错误。我改用南佛罗里达大学的https://zaa.ch/jison/try/usf/index.html这个网站,但有人建议我使用 Bison 来确保正确性。正如最高评论所建议的那样,Mul -> Mul * Mul非常模棱两可,所以我相应地更新了语法

适配BNF格式:

0 投票
1 回答
113 浏览

compiler-construction - 证明不是 LALR(1) 的 LR(1) 文法必须只有 reduce/reduce 冲突

有人可以向我解释为什么不是 LALR(1) 的 LR(1) 语法必须只有减少/减少冲突

0 投票
1 回答
65 浏览

parsing - 向 Treesitter LR1 语法添加规则更改优先级

我试图在 Treesitter 语法中使运算符优先级正确。Treesitter 是一个 LR1 解析器生成器。

我有一个简单的算术语法,部分看起来像这样:

这可以正常工作。multiply_expression确实比addition_expression.

但是,当我添加中间规则时,优先级会发生变化:

我转向$.expression, '*'了它自己的规则。对我来说,这似乎是一个等效的语法,我预计不会有任何变化。但是,随着这种变化,优先级不再正确。addition_expression,保持不变,似乎比 具有更高的优先级multiply_expression

为什么引入额外的步骤会改变优先级?是否有此问题的名称,或者我在哪里可以找到有关它的更多信息?在编写语法或修复优先级问题时,是否有要遵循的规则或思考方式?

0 投票
1 回答
22 浏览

parsing - 左递归文法的 LR(1) 项集

我阅读了几篇关于创建 LR(1) 项集的论文,但没有一篇与左递归文法有关,例如用于解析表达式的文法。如果我有以下语法,

我将如何创建 LR(1) 项目集?