问题标签 [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.
javascript - 空块和空对象语法冲突警告
我正在尝试在Jison中实现解析器。解析器支持 JSON objects:{ a: 1 }
和 blocks: if (true) { statement(); }
。
我的语法看起来像:
两者都有一个{}
规则,block
因为objectExpression
我需要同时支持空对象和空块。
它可以工作,但会输出很多警告,例如:
如何修复或抑制这些警告?
parsing - 如何重写上下文无关语法使其成为 LR(1)?
对于给定的上下文无关文法:
如何重写语法使其成为 LR(1)?
当前语法在解析输入“id : .id”时存在移位/减少冲突,其中“。” 是解析器的输入指针。
该文法产生满足正则表达式 (id:(id)*)+ 的语言
compiler-construction - 野牛移位/减少冲突 - 老虎编译器
我根据Tiger Book(附录A,Tiger 手册)编写了一个yacc 文件。
但是仍然存在一些移位/减少冲突。我不知道如何解决这些冲突。
您可以使用此 cmd 重现问题:
% cat tiger.y
:
c - Bison 中的一元优先级
当解析器试图弄清楚某事是一元运算符还是二元运算符时,我不断地遇到移位/减少冲突。
我知道我有很多代币,我最终会使用它们。我只是想让表达式工作的语法。这是我得到的移位/减少错误
我已经没有想法了,如果我能得到任何帮助,我将不胜感激。
yacc - 移位/减少与中缀部分的冲突
我在使用包含普通中缀操作和中缀部分的语法的类似 yacc 的实现(特别是使用 ocamlyacc)时遇到问题,例如在 Haskell 中。我希望所有这些都符合语法:
但是,即使摆弄关联性/优先级声明,我也无法使其正常工作。我可以在 Grammar.output 中看到问题发生的位置(它正在转移到我希望它减少的地方),但我无法哄它按照我想要的方式运行。这是该问题的简化演示。
lex.mll 有:
main.ml 有:
和 parse.mly (问题出在哪里)有:
运行ocamlyacc
它告诉我有1 shift/reduce conflict
。特别是这里是详细日志的相关部分:
运行编译后的程序将正确解析以下所有内容:
但失败:
另一方面,如果我创建一个HIGH
具有高优先级的虚拟令牌:
然后穿上%prec HIGH
规则 9:
在这种情况下(1+2)
会解析但(1+)
不会。
我了解移位/减少冲突的一般背景。我只是不知道如何协商它来解决这个解析挑战。
bison - 移位/减少错误 BISON
尝试编译语法时出现 2 个 shift/reduce 错误:
我得到 2 班次/减少
状态 38 冲突:1 次移位/减少 状态 139 冲突:1 次移位/减少
具体状态是:
有人可以解释一下如何解决这个错误,我知道它与优先级有关。
parsing - Bison - 移位/减少冲突标识符
我在状态 19 有 1 个班次/减少冲突。我认为“标识符”的不同出现可能存在问题,但我正在努力理解野牛报告并解决冲突。下面是我的语法,后面是带有状态信息的野牛报告:
野牛报告:
haskell - 如何重写语法以消除移位减少冲突(在 Haskell Happy 解析器中)
我正在尝试使用Happy LALR 解析器生成器为方法(类 java)定义语法
这里,
- MD:方法声明
- VD:变量声明
- S:声明
- T:类型
- 一:标识符
- E:表达
所有其他令牌都是终端。
在该方法中,变量声明在顶部和之后的语句中完成。
如您所见,VD 可以从 I 开始,因为可以有类型为标识符 (I) 的类型类的变量声明。语句也可以从 I 开始,因为分配给变量并且变量名称是 I
问题是 VD 和 S 都可以从 I 开始。因此,在第一个生产中,它会导致移位/减少冲突。
有没有办法重写语法或任何其他解析器生成器技巧来解决这个问题?
我已经为运算符指定了关联性和优先级。我只提到了解释问题的最少信息集。如果您需要更多信息,请与我们联系。
更新:
以下是语法文件
由 Happy 解析器生成的 .info 文件,其中包含 shift-reduce 冲突和状态的详细信息
parsing - 尽管有优先规则,但转移/减少冲突
我正在为其编写解析器的语言具有三个与此处相关的结构:由ord
表示的运算符,TOK_ORD
它将字符表达式转换为整数表达式,以及[
]
和.
,分别用于索引和字段访问,就像在 C 中一样。
这是我的优先规则的摘录:
我的语法有一个非终结符expr
,它代表表达式。这是语法中的一些相关片段(TOK_IDENT
是我.l
文件中定义的标识符的正则表达式):
以下是野牛输出文件中有关移位/减少冲突的信息:
州 92 和 93,供参考:
我不明白为什么会有移位/减少冲突。我的语法清楚地定义了索引和字段访问的优先级高于ord
,但这似乎还不够。
如果您想知道,是的,这是家庭作业,但作业已经上交并评分。我要回过头来尝试修复班次/减少冲突,以便更好地了解发生了什么。
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 :: 移位项目:
减少项目:
过渡: