问题标签 [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.
bison - 如何解决这个 S/R 冲突
这是我的工作 EBNF 语法的简化:
\n 和 EOF 都将 NEWLINE 作为令牌吐出(因此在 EOF 之前不需要单个结尾的 NEWLINE)。它适用于这样的流:
现在我想有几个line
,block
至少一个是强制性的,其余的用NEWLINE
. 例如:
我试过这样做:
但是 Jison 在前瞻时抱怨 S/R 冲突NEWLINE
。我猜状态机在决定它NEWLINE
是新块的一部分line
还是最终NEWLINE*
输入时感到困惑file
(这是必需的,因为文件可以以 NEWLINE/EOF 结尾)。
我怎样才能解决这个问题?
grammar - ifequal 构造语法实现
我必须创建识别这一点的语法:
如果两个表达式相等,则执行 statement1,如果第一个较小,则执行第二个,如果较大,则执行第三个。我试图做出与此解决方案类似的东西,但没有运气。我不能使用优先级,因此必须正确更改语法。我正在使用杯子工具生成解析器。
编辑:更小和更大的部分是可选的。
compiler-construction - 消除减少/减少冲突
我为具有以下语法的语言创建了一个编译器,由 ML-Yacc 定义(起始符号是底部定义的“程序”):
这个语法很好,但是现在我想引入参数多态性,因此在语法中添加了以下产生式:
现在我遇到了以下 2 个减少/减少冲突,我不知道如何解决
谁能告诉我如何消除这两个冲突?
编辑:这是来自 mlyacc http://pastebin.com/2w26ytuV的完整 .desc 输出。并不是说这个也显示了 2 个良性移位/减少错误
yacc - yacc shift/reduce 冲突:函数调用与函数定义
我有以下 lex 定义:
以及以下 yacc 生产规则:
如果我注释掉最后一条规则,一切都会编译得很好。对于最后一条规则,我遇到了冲突:
所以我猜,yacc 无法决定是将下一个符号移到堆栈上还是使用给定规则减少堆栈。
我的语法有歧义吗?
规则“trailed: trailed arglist”和“statement: NAME arglist COLON expression SEMICOLON”之间的决定不应该没有冲突,因为前者从来没有冒号,而后者总是有?
这与前瞻缓冲区的大小有关吗?
如何修复此语法以解析“a (b) ();” 和“a (b, c): b + c;” 作为有效的陈述?
如何以更详细的方式回溯冲突?
- - 编辑
关于迈克尔莫泽的回答:
改变
至
正如建议的那样没有帮助。与 active的第二条规则仍然存在冲突statement
,并且一旦注释掉该规则,就不会给出任何冲突。
parsing - Persistent Shift - 减少 Goldparser 中的冲突
我真的陷入了 Goldparser 中的 Shift-Reduce 冲突。
我写了一个类似 PHP 的语法,理论上应该可以解析以下脚本:
在顶部,我想分配全局变量,然后是函数定义。
为了缩小问题范围,我将我的大语法减少到可以重现错误的以下几行。显然这是不完整的。这些函数没有参数,没有返回值,也没有语句......
在构建 LALR 表时,Goldparser 告诉我:
“Shift-Reduce 冲突已修复为‘私人’、‘受保护’、‘公共’可以遵循已完成的规则,也可以进行转移。通过选择‘转移’操作而不是‘减少’来解决冲突。小心,一些部分语法可能无法访问。建议您尝试删除所有冲突。”
但它应用的修复使语法无法正常工作。在上面的示例中,尽管我将它们声明为可选的function Main()
,但在需要 ' private
'、' protected
' 或 ' ' 的地方出现语法错误。public
当我<ModifierOpt>
从<FuncDef>
定义或定义中删除时,错误消失了<GlbAssignVar>
。
我不知道如何解决这个问题。请帮忙!
sas - 用野牛中的空规则移位减少错误
我有以下yacc语法:
对于空规则,它给了我移位/减少错误。错误的 Y.output 文件如下所示:
有人可以建议,如何解决这个问题?
recursion - 由于递归规则而移位/减少
我正在尝试使用 flex & bison 编写给定语言的迷你编译器。它工作得很好,直到我发现我忘记了一个包含递归的规则,规则是:
当我添加它时,我遇到了我不理解的 shift/reduce 冲突。我的语法没有歧义
这是我的语法的简化版本:
它基本上说我可以在 DATA 块中定义字符和常量
这是我的 .output
它说我的班次/减少冲突处于状态 11 和 13,但我无法弄清楚究竟是为什么。它应该识别这样的东西:
parsing - 用杯子移位/减少错误
嗨,我正在为我的大学使用的编程语言编写解析器,使用 jflex 和 Cup 我从最初的基本结构开始,例如处理变量声明。
我收到以下错误
我的杯中代码如下所示:
我想我得到了错误,因为进程声明和变量声明都以标识符开头,然后是“:”,然后是终端进程或像整数这样的终端。如果是这样,我想知道如何告诉我的解析器向前看一点。或任何可能的解决方案。
感谢您的回答。
parsing - 修复野牛语法中的移位/减少冲突
我为解析文本文件而编写的野牛语法给了我 10 个移位/减少冲突。parser.output 文件对我的帮助不够。该文件给我的信息如下:
我的语法的等效部分是:
请帮我解决这个问题..
谢谢
grammar - Bison 语法偶尔通过,偶尔失败
我第一次广泛使用 Bison 语法。我有我的语法设置,和一个小测试套件来关联结果。
有时,测试套件会通过:
有时,它不会:
ENDMATH
是要转移到的正确标记,但有时MN
是确定的。每当我运行测试时,我都会得到不一致的结果。这种“随机”的歧义正常吗?可能是什么原因造成的?我应该定义一些%precedence
规则吗?
在y.output的顶部,我确实看到了一些状态冲突,例如
消除所有这些冲突是否可取?请注意,状态 120 被列为有冲突,并且是发生此随机错误之前的状态。