为什么';YACC是否能减少冲突?

为什么';YACC是否能减少冲突?,c,parsing,bison,yacc,shift-reduce-conflict,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 ; %%

努力理解转变,减少冲突并解决它们

我有下面的YACC代码,我希望它能减少冲突,但Bison并没有生成任何这样的警告

%%

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

declaraion : keyword ID
    ; 

func : keyword ID SEMI_COLON
    ; 

keyword : INT
    | FLOAT
    ;

%%
但是,如果我在第二条规则中取消对分号的注释(即,
|声明分号
),我会得到shift-reduce冲突。我希望在这种情况下减少冲突。请帮我理解这一团糟

PS:考虑输入,

    1) int varName
    2) int func; 

如果给bison指定
-v
命令行标志,它将生成一个
.output
文件,其中包含生成的状态机,这可能有助于您了解发生了什么

请注意,bison实际上解析了扩充语法,该语法由您的语法和附加规则组成

start': start END
其中,
END
是一个特殊标记,其代码为0,表示输入结束,
start
是语法用作开始符号的任何符号。(这确保了bison解析器不会在其他有效输入的末尾默默忽略垃圾。)

这使你原来的语法清晰明了;在看到
varName
后,前瞻将是
END
,在这种情况下
声明将减少,或者是
;',将被移位(当看到以下
END
时,随后减少
func


在第二种语法中,冲突涉及减少
声明
或移动分号之间的选择。如果分号是
声明的一部分
,那么您会看到reduce/reduce冲突。

您能指出您希望与哪个reduce冲突的移位,以及您希望与哪个reduce冲突的两个reduce吗?当分号是先行标记时,堆栈将具有(关键字和ID)这足以使用规则“declaration”或“func”进行缩减,但我看到了*.output文件,每个规则都没有$end。$end只包含($accept:lang_cons$end)。@vijaymahanteshattigeri:没有人说增广语法会在每个规则的末尾添加一个标记!正如我所说,它只增加了一条规则。但是添加该规则允许结束标记在lookaheads中渗透,从而解决否则会发生的冲突。看看状态机。(您可以使用
--report=all
来查看所有计算的lookahead;阅读该输出以及对lookahead算法的良好描述,例如在dragon book中)