问题标签 [reduce-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.
oslo - 转移减少和减少减少冲突
我很难解决这个问题,需要一些帮助来理解减少和减少冲突。我有一个语法,我似乎无法理解它为什么会出现问题。我可以附上语法,但我想了解它是如何工作的。
第一个问题,Mgrammer 创建什么类型的解析器?据我了解, shift reduce 和 reduce reduce 冲突取决于解析器的类型。
第二个问题,什么表示减少减少冲突,什么表示转移减少冲突?
我知道词法分析和形式语法的基础知识,但是自从我从事语言设计工作以来已经有一段时间了,所以这里的任何帮助都非常合适。
更新:
我正在使用一种重要的空白语言,我想知道在 MGrammar 中这样做的可能性,我需要先看一下才能解决歧义吗?
yacc - 野牛移位而不是减少。减少/减少错误
用我的语言我可以写
我的语法不支持语句之间的换行符。else 只能与 if 一起使用。当我在我的规则中添加 optionalNL
else 之前的 optionalNL 会导致 3 个减少/减少。原因是它可以使用 IfExpr 中的第二条规则减少或减少到 exprLoop ,它允许表达式之间有许多换行符。
无论我做什么(我尝试在 optionalNL 和 ELSE 之前编写 %prec )它总是减少到 exprLoop ,这种情况下野牛会给我一个语法错误。我如何告诉野牛此时转移(其他可选NL)而不是减少?(到 exprLoop 导致 else 是一个错误)。
用于测试的示例文件
y.output http://www.pastie.org/707448
替代 .y 和输出。您可以看到它向前看,看到 \n 并且不知道减少规则或继续前进。我改变改变规则的顺序以获得不同的结果。但它要么总是期待一个 \n 要么总是期待一个 else,因此一个规则总是最终被忽略。状态 15
感谢 Kinopiko的回答
我将他的代码更改为没有冲突,然后努力使其更灵活。这是我的文件
测试.y
测试.y
编译后自动运行的测试文件
parsing - 创建 shift-reduce / reduce-reduce 免费语法
我正在尝试在 sablecc 中实现一个类似 Java 的简单语言解析器,尽管在实现,和语句时我经常遇到shift-reduce
/问题。reduce-reduce
if
while
block
例如,我考虑了以下内容:
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
问题)或完全标记的语法,这有点难以理解。
bison - 野牛减少/减少
我是 Bison 解析的新手,我无法理解它是如何工作的。我有以下语法,我在其中保持最低限度以突出问题。
如您所见,我想'~'
根据后面的表达式类型对运算符应用不同的函数。但是,这会产生 2 个减少/减少冲突。
当然,如果我像这样重写composite_expr 规则......
...然后没有冲突,但现在我不能打电话do_something_1()
ordo_something_2()
因为我不能再判断expr
is variable_expr
or composite_expr
。
还有其他方法可以做到这一点吗?谁能解释为什么首先减少/减少冲突?
请记住,这是一个精简版,实际上,规则composite_expr
很长。所以复制它是不可能的。
bison - 我如何告诉野牛有语法错误?
会发生什么情况,在分析 AST 后,我会在规则完成时知道是否有错误。我试过 yyerror("blah") 没有运气。
因为我不能告诉它有一个错误,它完成了另一个规则,现在有一个减少/减少冲突。这很烦人,因为我知道其中一个无效而不看另一个,但用户必须忍受 bc 我不知道怎么说忽略这个分支 bc 它无效
我该如何解决这个问题?
c - YACC 语法减少/减少冲突
我有以下语法来检查 XML 文件的有效性,文件以一个元素开始,然后是根节点。
我遇到了 1 个减少/减少冲突,但我不知道如何找到它。任何帮助,将不胜感激。
haskell - 快乐:减少/减少冲突
为什么这会引发有关减少/减少冲突的警告
但接下来可以吗?
bison - 如何解决 Bison 中的这种减少/减少冲突?
这是 [filename].output state 94 的摘录
opt_at_type 定义为:
你能告诉我为什么会这样吗?
bison - EBNF 到 Bison - 减少/减少错误
我必须将此 EBNF 翻译成野牛:
当我翻译赋值、if、while 语句和 proc_func_ 时,bison 没有错误。然而,当我在野牛中输入这个时,翻译复合语句:
有一个减少/减少错误。
有人可以向我解释一下,为什么会出现减少/减少错误,因为这对我来说没有意义。我真的很感激。
提前致谢。
grammar - 具有减少-减少冲突的简单歧义语法
以下解析逻辑表达式的简单语法会导致 reduce/reduce 冲突:
来自野牛的状态报告有:
我猜问题是它无法弄清楚如何解析“(a)+ 1 < 2”。如何消除这种语法的歧义?可能吗?