问题标签 [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.
parsing - 什么时候可以使用模棱两可的语法或产生式规则?(野牛移位/减少警告)
当然有很多关于解决移位/减少错误的文档和方法。野牛文档建议正确的解决方案通常只是 %expect 他们并处理它。
当你有这样的事情:
您可以像这样轻松解决它们:
我的问题是:最好是让语法有点模棱两可并期望转移/减少问题,还是尝试调整语法以避免它们更好?我怀疑有一个平衡,它是基于作者的需要,但我真的不知道。
oslo - 转移减少和减少减少冲突
我很难解决这个问题,需要一些帮助来理解减少和减少冲突。我有一个语法,我似乎无法理解它为什么会出现问题。我可以附上语法,但我想了解它是如何工作的。
第一个问题,Mgrammer 创建什么类型的解析器?据我了解, shift reduce 和 reduce reduce 冲突取决于解析器的类型。
第二个问题,什么表示减少减少冲突,什么表示转移减少冲突?
我知道词法分析和形式语法的基础知识,但是自从我从事语言设计工作以来已经有一段时间了,所以这里的任何帮助都非常合适。
更新:
我正在使用一种重要的空白语言,我想知道在 MGrammar 中这样做的可能性,我需要先看一下才能解决歧义吗?
parsing - 如何修复后增量运算符的 YACC 移位/减少冲突?
我正在用 YACC(实际上是 Bison)编写语法,并且遇到了移位/减少问题。它是由于包含后缀递增和递减运算符而产生的。这是语法的精简版:
Bison 告诉我有 12 个移位/减少冲突,但如果我注释掉后缀递增和递减的行,它就可以正常工作。有谁知道如何解决这个冲突?在这一点上,我正在考虑迁移到 LL(k) 解析器生成器,这使它更容易,但 LALR 语法似乎总是更自然地编写。我也在考虑 GLR,但我不知道有什么好的 C/C++ GLR 解析器生成器。
parsing - 解决我的语法中的 shift-reduce 冲突的问题
我正在尝试用Irony编写一个小型解析器。不幸的是,我遇到了“减少班次冲突”。语法不是我的强项,我只需要完成这件小事。这是产生错误的简化语法:
“班次减少冲突”是什么意思,我该如何解决?我认为这意味着我的语法模棱两可,但我无法充分扭曲我的逻辑以了解如何。
补充:澄清 - “asd”只是一个文字字符串“asd”。所以我希望这个语法会解析以下表达式:
补充2:忘了说,语法的根是LogicalExpression
。
补充3:啊,我明白了!模棱两可是因为像这样的表达
可以用两种不同的方式来解释:
但是我该如何解决呢?好的,我可以将 AND 或 OR 中的一个设置为比另一个更强大(无论如何我都想这样做)。但是现在我看到即使只有一个操作员也会出现错误。换句话说,这也会产生同样的错误:
在这种情况下,我想要这个:
要解析为:
这样做的明确方式是什么?
补充4:知道了!
这会解析所有布尔表达式,运算符优先级为 NOT->AND->OR。“asd”可以替换为您的条款的表达方式。
parsing - 帮助解决 Shift/Reduce 冲突 - 尝试建模 (XA)* (XB)*
我试图模拟 EBNF 表达式
我已经建立了 yacc(我使用 MPPG)语法,它似乎代表了这一点,但它与我的测试表达式不匹配。
我要匹配的测试用例是
来自词法分析器的令牌流是
语法分析表明存在“Shift/Reduce 冲突,KW_Declare 上的状态 6”。我试图用“%left PrologHeaderList PrologBodyList”解决这个问题,但两种解决方案都不起作用。
KW_Declare KW_Namespace KW_Variable 分隔符都是具有值“declare”、“naemsapce”、“variable”、“;”的标记。
parsing - 如何解决明确语法中的 shift-reduce 冲突
我正在尝试使用 LALR(1) 解析器生成器(Bison,但问题并非特定于该工具)解析一个简单的语法,并且我遇到了 shift-reduce 冲突。我发现的有关修复这些问题的文档和其他资源往往会说以下一项或多项:
- 如果语法有歧义(例如 if-then-else 歧义),请更改语言以修复歧义。
- 如果是运算符优先级问题,请明确指定优先级。
- 接受默认分辨率并告诉生成器不要抱怨它。
然而,这些似乎都不适用于我的情况:据我所知,语法是明确的(当然它只有一个前瞻字符是模棱两可的),它只有一个运算符,默认分辨率会导致解析错误在正确格式的输入上。是否有任何技术可以重新定义语法以消除不属于上述存储桶的移位减少冲突?
具体而言,这是有问题的语法:
目的是解析“[A-Za-z]+”或“[A-Za-z] -> [A-Za-z]+”形式的分号分隔的行。
yacc - 野牛移位/减少问题将添加操作移动到子表达式中
最初在示例中是这样的
我希望它“更简单”所以我写了这个(我意识到它会为加法和减法做'+'。但这是一个例子)
现在我得到一个移位/减少错误。它应该完全相同-_-(对我来说)。我需要做什么来解决这个问题?
编辑:说清楚。第一个没有警告/错误。我使用 %left 来设置优先级(我将使用 %right 来表示 = 和其他正确的操作)。但是,当进入子表达式时,它似乎并不适用。
yacc - 为什么我在“)”而不是“(”上有轮班减少/冲突?
我有类似的语法
和
和 (var)
我的规则是这样的
问题是它似乎无法判断 ) 是否属于%(CommaLoop)
或% (val)
但它抱怨 ) 而不是 (。到底是什么?它不应该抱怨(
吗?我应该如何修复错误?我认为制作%(
令牌是一个很好的解决方案,但我想$(
在执行此操作之前确定为什么不是错误。
yacc - 告诉 Bison/Yacc 改变而不是减少来解决冲突
我有一种情况,我理解有一个带有移位/减少冲突的规则。我希望规则永远不会减少,直到可能的最后一刻(行尾)。所以我想说总是换班。我该怎么做呢?
grammar - yacc shift减少问题
我有我认为是我语法的一个简单部分,这是来自 yacc 的错误。我知道我需要在某处添加 %prec,但不确定在哪里。
我得到的错误是:
所以ID只是一个变量名,Ref是一个变量的引用。