问题标签 [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.
yacc - 如何消除 yacc 语法中的 shift-reduce 冲突?
我有以下语法:
我在 y.output 文件中得到以下移位减少冲突:
我需要帮助来消除这些冲突。我在这里做错了什么?我试图设置优先规则,但它们似乎在这里不起作用。有任何想法吗?
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)
如果它有前任'[',我的问题如下,我希望它转移而不是减少。问题是我在文档中搜索数小时时找不到此错误的解决方案。我该如何解决这个问题(请特定于代码)。
bison - 解决 C 初始化列表的语法歧义
我似乎无法解决以下规则中包含的歧义:
InitializerList_a →,[Initializer][InitializerList_a]
它在我的解析器中引起了移位/减少冲突(我正在使用 Bison)。以下是它的关闭:
任何帮助,将不胜感激。如果需要,我可以发布野牛输出文件。
这是以更易读的方式编写的相同语法:
grammar - yacc 中的移位/减少错误
我知道我的语法的这一部分会导致错误,但我不知道如何解决它我什至使用 %left 和 right 但它没有帮助。谁能帮我找出这个语法有什么问题。在此先感谢您的帮助。
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
parsing - 如何克服 LALR 语法中的 shift-reduce 冲突
我正在尝试解析正数和负数小数。
包含前两个规则会产生移位/减少冲突,但我不知道如何编写语法以使冲突永远不会发生。我正在使用柠檬解析器。
编辑:来自 .out 文件的冲突
编辑 2:导致问题的最小语法
parsing - 用于模棱两可的 lambda 语法的 yacc shift-reduce
我正在为 Yacc 中的一种玩具语言(与 Go 打包的语言)编写语法,并且由于以下伪问题,我有一个预期的 shift-reduce 冲突。我必须将问题语法提炼成以下内容。
一个 lambda 函数看起来像这样:
我的解析器发出:
冲突:1班次/减少
给定输入:
expr
它按'(' expr ')'
规则正确解析。但是,如果输入:
(这将是标识函数的 lambda,返回其输入)。我得到:
语法错误:意外的“{”
这是因为当(a)
被读取时,解析器选择将其归约为'(' expr ')'
,而不是将其视为'(' params ')'
。鉴于这种冲突是一个减少而不是减少的冲突,我假设这是可以解决的。我只是不知道如何构建语法来支持这种语法。
编辑 | 这很难看,但我正在考虑定义一个标记,以便词法分析器可以识别 ')' '{' 序列并将其作为单个标记发送以解决此问题。
编辑 2 | 实际上,更好的是,我会让 lambdas 需要语法->(a, b) { a * b}
中的语法,但是让词法分析器发出->
而不是在实际的源代码中。
parsing - 如何解决 yacc 中的 shift/reduce 冲突
我的项目(制作迷你 C 编译器)期间遇到问题。
没有错误,我可以扫描和解析迷你 C 源代码文件。
但是在 *.output 文件中我发现
状态 154 冲突:1 班次/减少
在状态 17
这是我的 yacc 声明文件
parsing - 这可以由 LALR(1) 解析器解析吗?
我正在用 Bison 为一种具有以下结构的语言编写解析器,其中包括:
- 自发货:[
identifier
arguments
] - 调度:[
expression
。identifier
arguments
] - 字符串切片:
expression
[expression
,expression
] - 类似于 Python。
arguments
是一个以逗号分隔的表达式列表,也可以为空。以上所有内容本身也是表达方式。我的问题是我不确定如何解析两者[method [other_method]]
,[someString[idx1, idx2].toInt]
或者是否可以使用 LALR(1) 解析器来完成。
更准确地说,让我们看下面的例子:(用方法的结果[a[b]]
调用方法)。当它达到状态时。(前瞻是第二个),它不知道是减少(已经减少到),因为可能会出现类似的东西(它本身可以减少到并继续上面的第二个构造)还是保留它(并转移它),因为后面会出现一个列表(例如在这种情况下)。a
b
[a
[b]]
[
a
identifier
expression
a[b,c]
expression
identifier
arguments
[b]
这种移位/减少冲突是由于我表达这种语法的方式造成的,还是不可能用 LALR(1) 解析器解析所有这些结构?
而且,一个更普遍的问题是,如何证明一种语言可以/不能被特定类型的解析器解析?
parsing - 简单调用表达式/lambda语法中的野牛移位/减少冲突
我有一个转变/减少冲突,我无法弄清楚它为什么会发生,以及如何解决它。
鉴于此语法:
我希望能够解析这样的表达式(不详尽):
但是我在这里收到了移位/减少冲突:
我以为我明白何时发生班次/减少,但这个人正在逃避我,所以我需要接受教育。
我尝试更多地了解可用的优先级指令,left, right, precedence, nonassoc
但是我尝试使用它们并不能解决歧义,而且它们也给了我warning: useless precedence and associativity
,所以我做错了。希望答案对其他人来说是显而易见的。
我最初认为这与 Lambdas 以它开头()
和 CallExpressions 以它结尾的事实有关,但是将这些标记更改为不冲突没有任何区别。
/掌脸