反讽减少 - 减少问题

时间:2015-06-11 23:53:02

标签: shift-reduce-conflict irony ambiguous-grammar reduce-reduce-conflict angelscript

我一直试图找出同样的问题近两周了。起初,它是减少转移的错误,现在它的减少 - 减少问题。我尝试过这么多方法,现在我已经到了需要帮助的地步。我编写了许多语言并在大约10年前开始,这是我第一次真正发布了帮助。

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

找到语言参考

在每个规则的课堂上,我都添加了BNF语法的评论,我试图复制。目前我还没有真正使用我定义的关键字。一旦我能够无冲突地工作,我会回去尝试清理它。这是我的班级http://pastebin.com/FydCTqmU

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

我尝试压缩我的代码以希望通过减少 - 减少错误但它似乎保持完全相同但只是看起来更混乱。如果有人能帮助我做对,我会更乐意通过paypal向他们发送几百美元。我只是放弃了超过2周的时间,我已经在这上面了。我的电子邮件是Anth0ny229@live.com。

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

状态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

1 个答案:

答案 0 :(得分:0)

冲突意味着你的语法含糊不清,有两种或更多种方法可以解析同一个东西。

减少冲突意味着不同的非终结符号可以应用于同一输入。在你的情况下,我认为这是因为像#" 5"可以是int8,int16等。

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