gpt4 book ai didi

java - 如何消除 bison 中变量声明的移位/减少冲突?

转载 作者:行者123 更新时间:2023-12-02 13:22:55 26 4
gpt4 key购买 nike

我正在研究我的编译器设计项目,我必须消除这个语法中的所有歧义。首先,以下代码(.yac)有 27 个移位/归约冲突和 3 个归约/归约冲突。我设法使它们只有 15 个移位/归约冲突,现在我可以看到只有变量声明上存在冲突,例如 BOOLEAN_KWCHRACTAR_KW 等。我真的需要解决这个问题,我知道这里需要使用一些优先级优先级,并且我已经测试了很多可能性,但没有成功。如果有人可以帮助我处理 Bison 的这个输出文件,该文件显示了移位/归约上的冲突,我将非常感激。顺便说一句,我猜这些减少/冲突是 bison 出于确认目的而给我的一些警告,但不幸的是,即使知道这一点也不能让我运行整个 词法分析器解析器

 Error : syntax error
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at YYParser$YYStack.stateAt(YYParser.java:315)
at YYParser.parse(YYParser.java:1568)
at global.main(global.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

最后,这是使用 bison 启用 --verbose-o output 选项的输出,它显示了代码前面部分中的冲突: My code is uploaded here .

最佳答案

关键警告是:

Rules useless in parser due to conflicts

5 declarations: /* empty */

指的是这些作品:

declarations_list: declarations_list declarations
| /* empty */

declarations: type_specifiers declarator_list SEMICOLON_KW
| /* empty */

这表示 declarations_list 由零个或多个声明组成。但是,声明可能为空。所以这显然是不明确的:在给定的 declarations_list 中出现了多少个空的非终结符声明实例?它可以是任何数字,因为它们都是空的。

所有的移位/归约冲突都源于这种本质上的模糊性。当解析器需要一个declarations_list时,它需要决定在列表的开头解析多少个空的声明

默认情况下,它选择不插入任何声明,这使得产生式:

declarations: /* empty */

没用(正如警告所说)。由于产生式实际上是无用的,您不妨将其删除,从而避免歧义(以及移位/归约冲突)。

Austin Hastings在评论中指出,这对解析器的行为没有影响。解析器已经消除了无用的产生式,这不会改变对任何输入的响应。因此,如果某些输入在您尝试解析它时生成意外的语法错误,则反射(reflect)了您的语法存在一些不同的问题。

关于java - 如何消除 bison 中变量声明的移位/减少冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43501177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com