2017-05-23 44 views
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.我如何擺脫衝突並仍然保持語法的「邏輯」?

感謝您的幫助事先。

回答

1

當然,它試圖使用空的規則「無處不在」。它正在做你告訴它做的事情。

你說的是,非終結OPTIONS代表OPTION非終端任意正數,以及OPTION非終端可以是C或空。

由於OPTION可以爲空,所以在空輸入中可以有任意數量的它們。兩個空OPTION看起來完全像153空OPTION s。更重要的是,兩個C令牌之間可以有任意數量的空OPTION

所以你的語法是不明確的,野牛報告解析衝突。

如果你想定義OPTIONS任何數量的OPTION S,包括零個OPTION S,然後只是說:

options: %empty 
     | options option 
option : 'C' 
+0

YACC:電子 - 「test.y」,語法錯誤 %的線13空 yacc -V yacc - 1.9 20070509 – abdullam

+0

@abdullam:在舊版本的野牛或除野牛之外的yacc實現中,不要使用'%empty'。只要把它放在外面,或者使用'/ * EMPTY * /'或其他方式(如在你的語法中)。 – rici

+0

所以不能擺脫舊版本的衝突? – abdullam