试图了解减少班次的冲突并加以解决。
我遵循了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;
答案 0 :(得分:3)
如果给野牛-v
命令行标志,它将生成一个包含生成的状态机的.output
文件,这可能会帮助您了解发生了什么。
请注意,野牛实际上解析了增强语法,该语法由带有附加规则的语法组成
start': start END
其中END
是一个特殊标记,其代码为0,表示输入的结尾,而start
是您的语法用作起始符号的任何东西。 (这确保了野牛解析器不会在其他有效输入的末尾无声地忽略垃圾。)
这使您的原始语法无歧义;在看到varName
之后,前行将为END
(在这种情况下,declaration
会减小,或者是';'
),会前移(随后是{{ 1}}(看到以下func
)。
在第二个语法中,冲突涉及减少END
或转移分号之间的选择。如果分号是declaration
的一部分,那么您会看到减少/减少冲突。