0

我已经尝试解决这个问题将近 2 周了。起初是 shift-reduce 错误,现在是 reduce-reduce 问题。我已经尝试了很多方法,现在我已经到了需要帮助的地步。我已经编写了多种语言,并且几乎在 10 年前就开始了,这是我第一次真正发帖寻求帮助。

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

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

您应该能够只创建一个 Dll 并使用语法资源管理器运行它,您将看到所有错误。似乎大多数错误都来自同一个问题,所以我想也许一旦我能解决这个问题,它几乎可以解决所有问题。我编写了一个应用程序来帮助我将语法拆分为更不具体的部分,但我认为这导致我遇到了更多的 reduce-reduce 问题。

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

我已经从 shift-reduce 到 reduce-reduce 错误。似乎无论我做什么,我都会遇到问题。我只是无法绕过它,我真的需要帮助。正如我所提到的,我会更乐意向某人支付帮助,只需给我发电子邮件即可。我计划制作一个像 babelua 这样的 Visual Studio 扩展,这样人们就可以使用 Visual Studio 编写 Angel Script 脚本,并希望添加调试支持。它将是免费的,因为我认为这将是一个很好的补充。因此,如果有人能以任何方式提供帮助,只要它最终工作,我会更乐意确保他们得到回报。谢谢你。

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

script' -> ·script EOF 
script -> ·script_0_list 
script_0_list -> ·script_0+ 
script_0+ -> ·script_0+ script_0 
script_0+ -> ·script_0 
script_0 -> ·import 
import -> ·import type import_0_opt identifier paramlist from string ; 
script_0 -> ·enum 
enum -> ·enum_0_opt enum identifier { identifier enum_1_opt enum_2_list } 
enum_0_opt -> ·shared 
script_0 -> ·typedef 
typedef -> ·typedef primtype identifier ; 
script_0 -> ·class 
class -> ·class_0_list class identifier class_1_opt { class_2_list } 
class_0_list -> ·class_0+ 
class_0+ -> ·class_0+ class_0 
class_0+ -> ·class_0 
class_0 -> ·shared 
class_0 -> ·abstract 
class_0 -> ·final 
script_0 -> ·mixin 
mixin -> ·mixin class 
script_0 -> ·interface 
interface -> ·interface_0_opt interface identifier interface_1_opt { interface_2_list } 
interface_0_opt -> ·shared 
script_0 -> ·funcdef 
funcdef -> ·funcdef type funcdef_0_opt identifier paramlist ; 
script_0 -> ·virtprop 
virtprop -> ·virtprop_0_opt type virtprop_1_opt identifier { virtprop_2_list } 
virtprop_0_opt -> ·private 
virtprop_0_opt -> ·protected 
script_0 -> ·func 
func -> ·func_0_opt func_1_opt identifier paramlist func_2_opt func_3_list statblock 
func_0_opt -> ·private 
func_0_opt -> ·protected 
func_0_opt -> ·shared 
script_0 -> ·var 
var -> ·var_0_opt type identifier var_1_opt var_2_list ; 
var_0_opt -> ·private 
var_0_opt -> ·protected 
script_0 -> ·namespace 
namespace -> ·namespace identifier { script } 
script_0 -> ·;

减少项目:

script_0_list -> · [EOF]
enum_0_opt -> · [enum]
class_0_list -> · [class]
interface_0_opt -> · [interface]
virtprop_0_opt -> · [const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]
func_0_opt -> · [const ~ identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]
var_0_opt -> · [const identifier void int8 int16 int32 int64 int uint8 uint16 uint32 uint64 uint float double bool ? auto ::]

过渡:

script->S1, script_0_list->S2, script_0+->S3, script_0->S4, import->S5, import->S6, enum->S7, enum_0_opt->S8, shared->S9, typedef->S10, typedef->S11, class->S12, class_0_list->S13, class_0+->S14, class_0->S15, abstract->S16, final->S17, mixin->S18, mixin->S19, interface->S20, interface_0_opt->S21, funcdef->S22, funcdef->S23, virtprop->S24, virtprop_0_opt->S25, private->S26, protected->S27, func->S28, func_0_opt->S29, var->S30, var_0_opt->S31, namespace->S32, namespace->S33, ;->S34
4

1 回答 1

0

冲突意味着您的语法不明确,有 2 种或更多种方法可以解析同一事物。

减少减少冲突意味着不同的非终结符可以应用于相同的输入。在你的情况下,我认为这是因为像“5”这样的数字可以是 int8、int16 等。

提示:GNU Bison 使用与 Irony 类似的解析算法,它的帮助页面在处理此类错误时非常有用。

于 2015-06-15T13:27:18.927 回答