簡體   English   中英

野牛Yacc解決轉變減少沖突

[英]Bison Yacc resolve shift reduce conflict

如何更改此設置以消除移位/減少沖突?

var_part
    :                                           
    |   VAR var_declaration SEMIC var_part_multi
    ;

var_part_multi
    :   var_declaration SEMIC var_part_multi    
    |                                           
    ;

var_declaration
    :   ID id_list COLON ID                     
    ;

id_list
    :   COMMA ID id_list                        
    |                                           
    ;

我有兩個沖突,y.output給了我這個:

State 19 conflicts: 1 shift/reduce
State 59 conflicts: 1 shift/reduce

state 19

    4 var_part: VAR var_declaration SEMIC . var_part_multi
    5 var_part_multi: . var_declaration SEMIC var_part_multi
    6               
    7 var_declaration: . ID id_list COLON ID

    ID  shift, and go to state 12

    ID        [reduce using rule 6 (var_part_multi)]
    $default  reduce using rule 6 (var_part_multi)

    var_part_multi   go to state 33
    var_declaration  go to state 34

state 59

    5 var_part_multi: . var_declaration SEMIC var_part_multi
    5               | var_declaration SEMIC . var_part_multi
    6               | .  [ID, BEGIN, DOT, IF, FUNCTION, REPEAT, SEMIC, VAL, WHILE, WRITELN]
    7 var_declaration: . ID id_list COLON ID

    ID  shift, and go to state 12

    ID        [reduce using rule 6 (var_part_multi)]
    $default  reduce using rule 6 (var_part_multi)

    var_part_multi   go to state 95
    var_declaration  go to state 34

我知道問題出在ID上,它有兩條可能的路線,但是在過去的一個小時里,我一直在嘗試更改規則,添加優先級和諸如此類,並且無法消除沖突。 你們可以幫忙嗎?

您尚未粘貼足夠的語法來回答問題,但是幾乎可以肯定地與var_part_multi為空這一事實有關。

問題是使用var_part的上下文是什么? 特別是,如何在var_part后面加上以ID開頭的內容。

在這種情況下,由於var_part_multi可以為空,因此解析器將不得不選擇使用ID啟動非空var_part_multi還是減小空var_part_multi (然后減小var_part ),這將允許ID啟動非可以跟隨var_part終端。

順便說一下,在y.output文件的粘貼中, State 19下的第三行(以數字6開頭的行)已被截斷。 它應類似於State 59下的第三行。

如果您無法通過語法檢查來確定ID如何遵循var_part ,則可能有助於從兩個沖突狀態之一向后追溯狀態機。

我嘗試了不止一個獨立的yacc實施,並且所有人都同意您發布的語法是無沖突的。 例如:

$ cat so.y
%token VAR ID COLON SEMIC COMMA

%%

var_part
    :                                           
    |   VAR var_declaration SEMIC var_part_multi
    ;

var_part_multi
    :   var_declaration SEMIC var_part_multi    
    |                                           
    ;

var_declaration
    :   ID id_list COLON ID                     
    ;

id_list
    :   COMMA ID id_list                        
    |                                           
    ;
$ cat y.output
state 0 //

    0 $accept: . var_part
    1 var_part: .  [$end]

    $end  reduce using rule 1 (var_part)
    VAR   shift, and goto state 2

    var_part  goto state 1

state 1 // [$end]

    0 $accept: var_part .  [$end]

    $end  accept

state 2 // VAR

    2 var_part: VAR . var_declaration SEMIC var_part_multi

    ID  shift, and goto state 4

    var_declaration  goto state 3

state 3 // VAR ID COLON ID [SEMIC]

    2 var_part: VAR var_declaration . SEMIC var_part_multi

    SEMIC  shift, and goto state 11

state 4 // VAR ID

    5 var_declaration: ID . id_list COLON ID
    7 id_list: .  [COLON]

    COLON  reduce using rule 7 (id_list)
    COMMA  shift, and goto state 6

    id_list  goto state 5

state 5 // VAR ID [COLON]

    5 var_declaration: ID id_list . COLON ID

    COLON  shift, and goto state 9

state 6 // VAR ID COMMA

    6 id_list: COMMA . ID id_list

    ID  shift, and goto state 7

state 7 // VAR ID COMMA ID

    6 id_list: COMMA ID . id_list
    7 id_list: .  [COLON]

    COLON  reduce using rule 7 (id_list)
    COMMA  shift, and goto state 6

    id_list  goto state 8

state 8 // VAR ID COMMA ID [COLON]

    6 id_list: COMMA ID id_list .  [COLON]

    COLON  reduce using rule 6 (id_list)

state 9 // VAR ID COLON

    5 var_declaration: ID id_list COLON . ID

    ID  shift, and goto state 10

state 10 // VAR ID COLON ID

    5 var_declaration: ID id_list COLON ID .  [SEMIC]

    SEMIC  reduce using rule 5 (var_declaration)

state 11 // VAR ID COLON ID SEMIC

    2 var_part: VAR var_declaration SEMIC . var_part_multi
    4 var_part_multi: .  [$end]

    $end  reduce using rule 4 (var_part_multi)
    ID    shift, and goto state 4

    var_declaration  goto state 13
    var_part_multi   goto state 12

state 12 // VAR ID COLON ID SEMIC [$end]

    2 var_part: VAR var_declaration SEMIC var_part_multi .  [$end]

    $end  reduce using rule 2 (var_part)

state 13 // VAR ID COLON ID SEMIC ID COLON ID [SEMIC]

    3 var_part_multi: var_declaration . SEMIC var_part_multi

    SEMIC  shift, and goto state 14

state 14 // VAR ID COLON ID SEMIC ID COLON ID SEMIC

    3 var_part_multi: var_declaration SEMIC . var_part_multi
    4 var_part_multi: .  [$end]

    $end  reduce using rule 4 (var_part_multi)
    ID    shift, and goto state 4

    var_declaration  goto state 13
    var_part_multi   goto state 15

state 15 // VAR ID COLON ID SEMIC ID COLON ID SEMIC [$end]

    3 var_part_multi: var_declaration SEMIC var_part_multi .  [$end]

    $end  reduce using rule 3 (var_part_multi)

$ 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM