0
test.yYACC移位/減少空規則相沖突
%%
TOP :
OPTIONS
;
OPTIONS :
OPTION
| OPTIONS OPTION
;
OPTION :
/*no option is possible*/
| 'C'
;
%%
YACC -v test.y
y.output包含以下
0 $accept : TOP $end
1 TOP : OPTIONS
2 OPTIONS : OPTION
3 | OPTIONS OPTION
4 OPTION :
5 | 'C'
0: shift/reduce conflict (shift 1, reduce 4) on 'C'
state 0
$accept : . TOP $end (0)
OPTION : . (4)
'C' shift 1
$end reduce 4
TOP goto 2
OPTIONS goto 3
OPTION goto 4
state 1
OPTION : 'C' . (5)
. reduce 5
state 2
$accept : TOP . $end (0)
$end accept
3: reduce/reduce conflict (reduce 1, reduce 4) on $end
3: shift/reduce conflict (shift 1, reduce 4) on 'C'
state 3
TOP : OPTIONS . (1)
OPTIONS : OPTIONS . OPTION (3)
OPTION : . (4)
'C' shift 1
$end reduce 1
OPTION goto 5
state 4
OPTIONS : OPTION . (2)
. reduce 2
state 5
OPTIONS : OPTIONS OPTION . (3)
. reduce 3
State 0 contains 1 shift/reduce conflict.
State 3 contains 1 shift/reduce conflict, 1 reduce/reduce conflict.
3 terminals, 4 nonterminals
6 grammar rules, 6 states
爲什麼有移進/歸約並減少/減少衝突。
我已閱讀yacc解析器如何在http://dinosaur.compilertools.net/yacc/的「解析器如何工作」部分中工作,但我不明白yacc如何處理空白規則。似乎它試圖在任何地方使用空的規則。
問題1. yacc如何處理狀態機的空規則以及上面鏈接中描述的「向前看令牌」。
問題2.我如何擺脫衝突並仍然保持語法的「邏輯」?
感謝您的幫助事先。
YACC:電子 - 「test.y」,語法錯誤 %的線13空 yacc -V yacc - 1.9 20070509 – abdullam
@abdullam:在舊版本的野牛或除野牛之外的yacc實現中,不要使用'%empty'。只要把它放在外面,或者使用'/ * EMPTY * /'或其他方式(如在你的語法中)。 – rici
所以不能擺脫舊版本的衝突? – abdullam