问题标签 [shift-reduce-conflict]

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 回答
888 浏览

parsing - 移位/减少具有 n 元和/积的算术表达式语法中的冲突

解析二进制和/产品很容易,但我在定义解析的语法时遇到了麻烦

作为

我最初的(天真的)尝试产生了 61 次换档/减少冲突。

我正在使用 java cup(但我想任何其他解析器生成器的解决方案都可以轻松翻译)。

0 投票
3 回答
27016 浏览

grammar - 如何解决班次/减少冲突?

我正在使用 CUP 创建我的论文所需的解析器。我的语法有移位/减少冲突。我有这个生产规则:

我有这个警告:

现在,我实际上希望它改变,所以我很好,但我的教授告诉我要找到解决冲突的方法。我瞎了。我一直在阅读有关 if/else 冲突的信息,但对我而言,情况似乎并非如此。你能帮助我吗?

PS:IDENTIFIER、LPAREN "(" 和 RPAREN ")" 是终端,parlist 和 command 不是。

0 投票
1 回答
1573 浏览

shift-reduce-conflict - 移位/减少与 SableCC 的冲突

我第一次体验 SableCC 和语法定义。我有以下语法(其中一部分):

我有以下错误:

我通过将 l_par 和 r_par 添加到所有替代方案来解决它们,顺便说一下,这应该增加可读性,但是有没有办法以优雅的方式做到这一点?

谢谢。

0 投票
2 回答
2900 浏览

parsing - 简单语法的 Bison Shift/Reduce 冲突

我正在为我设计的一种语言构建一个解析器,其中类型名称以大写字母开头,变量名称以小写字母开头,这样词法分析器就可以区分并提供不同的标记。此外,词法分析器(它是一种 OOP 语言)可以识别字符串“this”并作为单独的标记传递。最后,数据成员只能在 'this' 对象上访问,所以我这样构建了语法:

Expression 的第一条规则允许用户将“this”作为值传递(例如,从方法返回它或传递给方法调用)。第二个是用于访问“this”上的数据。第三条规则用于调用方法,但是我删除了括号和参数,因为它们与问题无关。最初的语法显然比这大得多,但是这是产生相同错误的最小部分(1 Shift/Reduce 冲突) - 我将其隔离到自己的解析器文件中并验证了这一点,因此错误与任何错误无关其他符号。

据我所知,这里给出的语法是明确的,因此不应该产生任何错误。如果您删除三个规则中的任何一个或将第二个规则更改为

没有冲突。无论如何,我可能需要有人明确说明为什么会发生这种冲突以及如何解决它。

0 投票
1 回答
4791 浏览

compiler-construction - 如何解决移位减少我的语法冲突?

我正在编写一个从(简化的)Pascal 到 ARM asm 的编译器。我正处于该过程的第二步 - 在编写词法分析器之后,现在我正在使用java cup进行语法分析。

我写了我的语法,但有 5 个 S/R 冲突,它们都非常相似。例子:

我本节的语法:

我怎样才能消除这种冲突?

谢谢。

0 投票
1 回答
492 浏览

compiler-construction - 解决语法歧义

我将发布有问题的语法规则以开始。

请注意,在 main_interface 之后,如果编译器看到标记 T_BEGIN,它将不知道要转到哪个绑定规则。它可能意味着开始 bind_buttons 或者它可能意味着您想要跳过 bind_buttons 并且 T_BEGIN 是启动 bind_functions。

如何更改此语法以不出现此问题?

要求:我不允许添加/删除终端。我不能告诉用户他们必须改变他们编写代码的方式,我必须改变规则来处理它。

我被难住了,有什么想法吗?

更新: interface_sections : main_interface bind_buttons bind_functions bind_panel_items ;/* gui 程序的组成部分 */

通过野牛运行它时,这给了我相同的移位/减少错误。

但是,我认为它在正确的轨道上,我认为我需要将 T_BUTTONS 和 T_FUNCTIONS 和 T_PANEL 放在规则的前面

附加信息:

0 投票
1 回答
242 浏览

parsing - Packrat 解析器冲突

假设我尝试使用 Packrat 解析器解析字符串abc :

这里我使用了 Packrat 解析器支持的左递归,但我不明白为什么它会失败。根据 Parser 文档 P | 如果 P 成功,Q 等于 P,所以在这种情况下ab应该用“ab”而不是“a”替换,就像我替换ab为:

0 投票
1 回答
219 浏览

yacc - Happy/YACC 在应该换档时降低

我正在研究解析器,我真的很沮丧。在语言中,我们可以有这样的表达式:

或者

除了最后的空数组外,大部分都正确解析。在我的解析器中,我有:

然后一个 NewExpression 是:

然后 EmptyArrays 是一个或多个空大括号 - 如果 EmptyArrays 派生出空字符串,它会添加 20 个移位/减少冲突:

但是,当我在.info文件中查找解析器时,我得到了这个:

我希望如果我们处于状态 214 并且我们看到一个左大括号,我们应该将它移到堆栈上并继续解析 EmptyArrays。

我不完全确定发生了什么,因为当我通过以 开头的解析去除所有多余的行李(例如)时NewExpression,额外的括号会正确解析。表达式、语句或语法中的任何非终结符都不可能以左大括号开头。特别是因为我对 if/else 语句有类似的规则,它会产生移位/减少冲突,但如果下一个标记是 else 则选择移位(这个问题有据可查)。

你能帮我弄清楚出了什么问题吗?我真的很感谢你的帮助,我真的很喜欢风车试图找出问题所在。

0 投票
1 回答
288 浏览

parsing - 创建 shift-reduce / reduce-reduce 免费语法

我正在尝试在 sablecc 中实现一个类似 Java 的简单语言解析器,尽管在实现,和语句时我经常遇到shift-reduce/问题。reduce-reduceifwhileblock

例如,我考虑了以下内容:

stmts= stmt*;

stmt= if_stmt| block_stmt| while_stmt;

block_stmt= { stmts }| ;;

while_stmt= while ( predicate ) { stmts }|while ( predicate ) ;

例如,这种语法会导致这样的问题,即当你有某种形式的东西时

解析器将无法知道是只减少;(from block_stmt) 还是完全减少while (true);(from while_stmt)。

我一直在到处阅读shift-reduce/reduce-reduce问题的原因,我想我理解它们。但是一件事是要知道是什么导致了它们,而另一件事完全不同的是知道如何构造语法以使我避免它们。我尝试过以非常不同的方式实现语法,但最终还是遇到了问题。

我想,与其只是试图从一个特定的ss/rr问题中运行,还必须有一种范式来遵循这样的范式来避免这类问题?我相信我解决问题的方式一定是完全错误的:(

关于如何从头开始构建语法而不陷入所有这些陷阱的任何资源?关于这个问题的资源往往非常简单(说明明显的if then else问题)或完全标记的语法,这有点难以理解。

0 投票
1 回答
829 浏览

scheme - 如何避免 LALR 语法中用于解析嵌套列表的移位减少冲突?

我想创建一个 LALR 语法来解析嵌套列表,但我总是遇到移位/减少冲突。

我有 list1,它是 type1 项目和 list2 的列表:

我有一个 list2 ,它是 type2 项目的列表:

此语法产生移位/减少错误。我怎样才能避免它?

这是具体的Bigloo来源:

终端是:comment、new-line、text-chunk 和 white-space。非终结符是:输入、节点列表、节点和文本。

Bigloo 抱怨文本到文本块的缩减规则:

但我不认为这是一个 Bigloo 问题。它看起来像一个语法问题。