为什么';YACC是否能减少冲突?
努力理解转变,减少冲突并解决它们 我有下面的YACC代码,我希望它能减少冲突,但Bison并没有生成任何这样的警告为什么';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 ; %%
%%
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中)