问题标签 [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 回答
346 浏览

yacc - 如何消除 yacc 语法中的 shift-reduce 冲突?

我有以下语法:

我在 y.output 文件中得到以下移位减少冲突:

我需要帮助来消除这些冲突。我在这里做错了什么?我试图设置优先规则,但它们似乎在这里不起作用。有任何想法吗?

0 投票
2 回答
395 浏览

bison - Bison:在处理可选规则时转移/减少冲突解决

在 .y (yacc -- bison) 文件的语法上,我定义了以下规则:

C : E | D | F | 一个

甲:乙| B'['C']';

(这类似于带有可选 [C] 的 B)当我使用适当的词法分析器文件以适当的方式编译 .y 文件时,我得到以下 shift\reduce 冲突:

状态 48
74 A:B。
75 | 乙。'[' C ']'
'[' shift, and go to state 91
'[' [reduce using rule 74 (A)]
$default reduce using rule 74 (A)

如果它有前任'[',我的问题如下,我希望它转移而不是减少。问题是我在文档中搜索数小时时找不到此错误的解决方案。我该如何解决这个问题(请特定于代码)。

0 投票
1 回答
84 浏览

bison - 解决 C 初始化列表的语法歧义

我似乎无法解决以下规则中包含的歧义:

InitializerList_a →,[Initializer][InitializerList_a]

它在我的解析器中引起了移位/减少冲突(我正在使用 Bison)。以下是它的关闭:

任何帮助,将不胜感激。如果需要,我可以发布野牛输出文件。

这是以更易读的方式编写的相同语法:

0 投票
1 回答
261 浏览

grammar - yacc 中的移位/减少错误

我知道我的语法的这一部分会导致错误,但我不知道如何解决它我什至使用 %left 和 right 但它没有帮助。谁能帮我找出这个语法有什么问题。在此先感谢您的帮助。

0 投票
1 回答
596 浏览

bison - 野牛转移/减少冲突

我正在尝试在 Bison 输入文件上描述此语法: https ://courses.engr.illinois.edu/cs421/sp2011/mps/mp2/minijavasyntax.pdf

这是我的输入:

我在编译时遇到了两个 16 冲突。冲突之一,我用 --report=lookahead 运行 Bison:

OP_NOT Expression . [OP_OR, OP_AND, CMP_EQ, CMP_NEQ, CMP_GT, CMP_LT, CMP_GTE, CMP_LTE, OP_ADD, OP_MINUS, OP_MULT, OP_DIV, OP_MOD, ')', ';', ',', '[', ']']

我期望的是 '[' 不在 OP_NOT 前瞻标记中,因为 SUBSCRIPT 优先级必须高于 Operator !。其他的冲突是这样的。我该如何解决。Tks

0 投票
2 回答
1343 浏览

parsing - 如何克服 LALR 语法中的 shift-reduce 冲突

我正在尝试解析正数和负数小数。

包含前两个规则会产生移位/减少冲突,但我不知道如何编写语法以使冲突永远不会发生。我正在使用柠檬解析器。

编辑:来自 .out 文件的冲突

编辑 2:导致问题的最小语法

0 投票
2 回答
764 浏览

parsing - 用于模棱两可的 lambda 语法的 yacc shift-reduce

我正在为 Yacc 中的一种玩具语言(与 Go 打包的语言)编写语法,并且由于以下伪问题,我有一个预期的 shift-reduce 冲突。我必须将问题语法提炼成以下内容。

一个 lambda 函数看起来像这样:

我的解析器发出:

冲突:1班次/减少

给定输入:

expr它按'(' expr ')'规则正确解析。但是,如果输入:

(这将是标识函数的 lambda,返回其输入)。我得到:

语法错误:意外的“{”

这是因为当(a)被读取时,解析器选择将其归约为'(' expr ')',而不是将其视为'(' params ')'。鉴于这种冲突是一个减少而不是减少的冲突,我假设这是可以解决的。我只是不知道如何构建语法来支持这种语法。

编辑 | 这很难看,但我正在考虑定义一个标记,以便词法分析器可以识别 ')' '{' 序列并将其作为单个标记发送以解决此问题。

编辑 2 | 实际上,更好的是,我会让 lambdas 需要语法->(a, b) { a * b}中的语法,但是让词法分析器发出->而不是在实际的源代码中。

0 投票
0 回答
302 浏览

parsing - 如何解决 yacc 中的 shift/reduce 冲突

我的项目(制作迷你 C 编译器)期间遇到问题。

没有错误,我可以扫描和解析迷你 C 源代码文件。

但是在 *.output 文件中我发现

状态 154 冲突:1 班次/减少

在状态 17

这是我的 yacc 声明文件

0 投票
1 回答
261 浏览

parsing - 这可以由 LALR(1) 解析器解析吗?

我正在用 Bison 为一种具有以下结构的语言编写解析器,其中包括:

  • 自发货:[ identifier arguments]
  • 调度:[ expressionidentifier arguments]
  • 字符串切片:expression[ expression, expression] - 类似于 Python。

arguments是一个以逗号分隔的表达式列表,也可以为空。以上所有内容本身也是表达方式。我的问题是我不确定如何解析两者[method [other_method]][someString[idx1, idx2].toInt]或者是否可以使用 LALR(1) 解析器来完成。

更准确地说,让我们看下面的例子:(用方法的结果[a[b]]调用方法)。当它达到状态时。(前瞻是第二个),它不知道是减少(已经减少到),因为可能会出现类似的东西(它本身可以减少到并继续上面的第二个构造)还是保留它(并转移它),因为后面会出现一个列表(例如在这种情况下)。ab[a[b]][aidentifierexpressiona[b,c]expressionidentifierarguments[b]

这种移位/减少冲突是由于我表达这种语法的方式造成的,还是不可能用 LALR(1) 解析器解析所有这些结构?

而且,一个更普遍的问题是,如何证明一种语言可以/不能被特定类型的解析器解析?

0 投票
0 回答
281 浏览

parsing - 简单调用表达式/lambda语法中的野牛移位/减少冲突

我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。

鉴于此语法:

我希望能够解析这样的表达式(不详尽):

但是我在这里收到了移位/减少冲突:

我以为我明白何时发生班次/减少,但这个人正在逃避我,所以我需要接受教育。

我尝试更多地了解可用的优先级指令,left, right, precedence, nonassoc但是我尝试使用它们并不能解决歧义,而且它们也给了我warning: useless precedence and associativity,所以我做错了。希望答案对其他人来说是显而易见的。

我最初认为这与 Lambdas 以它开头()和 CallExpressions 以它结尾的事实有关,但是将这些标记更改为不冲突没有任何区别。

/掌脸