问题标签 [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 投票
2 回答
118 浏览

javascript - 空块和空对象语法冲突警告

我正在尝试在Jison中实现解析器。解析器支持 JSON objects:{ a: 1 }和 blocks: if (true) { statement(); }

我的语法看起来像:

两者都有一个{}规则,block因为objectExpression我需要同时支持空对象和空块。

它可以工作,但会输出很多警告,例如:

如何修复或抑制这些警告?

0 投票
1 回答
553 浏览

parsing - 如何重写上下文无关语法使其成为 LR(1)?

对于给定的上下文无关文法:

如何重写语法使其成为 LR(1)?
当前语法在解析输入“id : .id”时存在移位/减少冲突,其中“。” 是解析器的输入指针。
该文法产生满足正则表达式 (id:(id)*)+ 的语言

0 投票
1 回答
5198 浏览

compiler-construction - 野牛移位/减少冲突 - 老虎编译器

我根据Tiger Book(附录A,Tiger 手册)编写了一个yacc 文件。

但是仍然存在一些移位/减少冲突。我不知道如何解决这些冲突。

您可以使用此 cmd 重现问题:

% cat tiger.y

0 投票
1 回答
651 浏览

c - Bison 中的一元优先级

当解析器试图弄清楚某事是一元运算符还是二元运算符时,我不断地遇到移位/减少冲突。

我知道我有很多代币,我最终会使用它们。我只是想让表达式工作的语法。这是我得到的移位/减少错误

我已经没有想法了,如果我能得到任何帮助,我将不胜感激。

0 投票
1 回答
148 浏览

yacc - 移位/减少与中缀部分的冲突

我在使用包含普通中缀操作和中缀部分的语法的类似 yacc 的实现(特别是使用 ocamlyacc)时遇到问题,例如在 Haskell 中。我希望所有这些都符合语法:

但是,即使摆弄关联性/优先级声明,我也无法使其正常工作。我可以在 Grammar.output 中看到问题发生的位置(它正在转移到我希望它减少的地方),但我无法哄它按照我想要的方式运行。这是该问题的简化演示。

lex.mll 有:

main.ml 有:

和 parse.mly (问题出在哪里)有:

运行ocamlyacc它告诉我有1 shift/reduce conflict。特别是这里是详细日志的相关部分:

运行编译后的程序将正确解析以下所有内容:

但失败:

另一方面,如果我创建一个HIGH具有高优先级的虚拟令牌:

然后穿上%prec HIGH规则 9:

在这种情况下(1+2)会解析但(1+)不会。

我了解移位/减少冲突的一般背景。我只是不知道如何协商它来解决这个解析挑战。

0 投票
2 回答
267 浏览

bison - 移位/减少错误 BISON

尝试编译语法时出现 2 个 shift/reduce 错误:

我得到 2 班次/减少

状态 38 冲突:1 次移位/减少 状态 139 冲突:1 次移位/减少

具体状态是:

有人可以解释一下如何解决这个错误,我知道它与优先级有关。

0 投票
1 回答
211 浏览

parsing - Bison - 移位/减少冲突标识符

我在状态 19 有 1 个班次/减少冲突。我认为“标识符”的不同出现可能存在问题,但我正在努力理解野牛报告并解决冲突。下面是我的语法,后面是带有状态信息的野牛报告:

野牛报告:

0 投票
2 回答
615 浏览

haskell - 如何重写语法以消除移位减少冲突(在 Haskell Happy 解析器中)

我正在尝试使用Happy LALR 解析器生成器为方法(类 java)定义语法

这里,

  • MD:方法声明
  • VD:变量声明
  • S:声明
  • T:类型
  • 一:标识符
  • E:表达

所有其他令牌都是终端。

在该方法中,变量声明在顶部和之后的语句中完成。

如您所见,VD 可以从 I 开始,因为可以有类型为标识符 (I) 的类型类的变量声明。语句也可以从 I 开始,因为分配给变量并且变量名称是 I
问题是 VD 和 S 都可以从 I 开始。因此,在第一个生产中,它会导致移位/减少冲突。

有没有办法重写语法或任何其他解析器生成器技巧来解决这个问题?

我已经为运算符指定了关联性和优先级。我只提到了解释问题的最少信息集。如果您需要更多信息,请与我们联系。


更新:

以下是语法文件

由 Happy 解析器生成的 .info 文件,其中包含 shift-reduce 冲突和状态的详细信息

0 投票
1 回答
575 浏览

parsing - 尽管有优先规则,但转移/减少冲突

我正在为其编写解析器的语言具有三个与此处相关的结构:由ord表示的运算符,TOK_ORD它将字符表达式转换为整数表达式,以及[ ].,分别用于索引和字段访问,就像在 C 中一样。

这是我的优先规则的摘录:

我的语法有一个非终结符expr,它代表表达式。这是语法中的一些相关片段(TOK_IDENT是我.l文件中定义的标识符的正则表达式):

以下是野牛输出文件中有关移位/减少冲突的信息:

州 92 和 93,供参考:

我不明白为什么会有移位/减少冲突。我的语法清楚地定义了索引和字段访问的优先级高于ord,但这似乎还不够。

如果您想知道,是的,这是家庭作业,但作业已经上交并评分。我要回过头来尝试修复班次/减少冲突,以便更好地了解发生了什么。

0 投票
0 回答
339 浏览

parsing - Irony Shift 减少问题

我一直在试图弄清楚如何解决我遇到的一些转变减少冲突。我环顾四周,发现了修复它的不同主题,但似乎无论我做什么,我似乎都找不到解决这些问题的方法。

我正在尝试为流行的脚本引擎 Angel Script 编写语法类,我从解析器类中获得了 BNF 语法。您可以在此处找到语言参考 http://www.angelcode.com/angelscript/sdk/docs/manual/doc_script.html

在我的课堂上,我为每条规则添加了一条关于我试图复制的 BNF 语法的评论。目前我实际上并没有使用我定义的关键字。一旦我可以让它在没有冲突的情况下工作,我会回去尝试清理它。这是我的课 http://pastebin.com/FydCTqmU

您应该能够只创建一个 Dll 并使用语法资源管理器运行它,您将看到所有错误。似乎大多数错误都来自同一个问题,所以我想也许一旦我能解决这个问题,它几乎可以解决所有问题。

编辑:这是主要问题。那是主要的脚本状态,我知道它被分解成许多不同的规则,但我这样做了,所以我可以尝试解决我仍然没有运气的问题。

编辑:我尝试压缩我的代码以希望通过reduce-reduce错误,但它似乎保持完全相同,只是看起来更加混乱。如果有人能帮我把它弄好,我会很乐意通过贝宝寄给他们几百美元。我正要放弃它已经一个多星期了。我的电子邮件是 Anth0ny229@live.com。

状态 S0(不足)输入上的减少-减少冲突: const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto :: 移位项目:

减少项目:

过渡: