YACC为什么不产生班次减少冲突?

时间:2019-08-26 06:42:31

标签: c parsing bison yacc shift-reduce-conflict

试图了解减少班次的冲突并加以解决。

我遵循了YACC代码,原本希望这样做以减少移位,但Bison不会生成任何此类警告

%%

lang_cons: /* empty */
         | declaraion // SEMI_COLON
         | func
    ;

declaraion : keyword ID
    ; 

func : keyword ID SEMI_COLON
    ; 

keyword : INT
    | FLOAT
    ;

%%

但是,如果我在第二条规则(即| declaraion SEMI_COLON)中取消对SEMI_COLON的注释,则会出现shift-reduce冲突。我期待在这种情况下减少-减少冲突。请帮助我了解这个烂摊子!

PS:考虑输入,

    1) int varName
    2) int func; 

1 个答案:

答案 0 :(得分:3)

如果给野牛-v命令行标志,它将生成一个包含生成的状态机的.output文件,这可能会帮助您了解发生了什么。

请注意,野牛实际上解析了增强语法,该语法由带有附加规则的语法组成

start': start END

其中END是一个特殊标记,其代码为0,表示输入的结尾,而start是您的语法用作起始符号的任何东西。 (这确保了野牛解析器不会在其他有效输入的末尾无声地忽略垃圾。)

这使您的原始语法无歧义;在看到varName之后,前行将为END(在这种情况下,declaration会减小,或者是';'),会前移(随后是{{ 1}}(看到以下func)。

在第二个语法中,冲突涉及减少END或转移分号之间的选择。如果分号是declaration的一部分,那么您会看到减少/减少冲突。