2014-01-12 83 views
2

當我用bison test.y編譯下面的語法時,它警告非終端「header_stms」和「forward」是無用的。爲什麼?它們用於「程序」規則中。非終結符「stm」不報告無用。語法中無用的野牛

%% 

program: /* empty */ 
    | stm 
    | header_stms 
    ; 

header_stms: header_stms forward 
    ; 

/* forward proc declaration */ 
forward: "forward" TK_ID ";" 
    ; 

stm: TK_ID "+" TK_ID 
    ; 

%% 

使用這些非終止符的規則也被認爲是無用的。

回答

1

這是因爲STM沒有如何降低到程序規則,試試這個:

%% 

program: /* empty */ 
     | stm 
     | header_stms 
     ; 

header_stms: /* empty */ 
      | forward 
      | header_stms forward 
      ; 

/* forward proc declaration */ 
forward: "forward" TK_ID ";" 
     ; 

stm: /* empty */ 
    | TK_ID "+" TK_ID 
    ; 

%% 

另外,我解決你的問題,減少在header_stms,通過左遞歸。

+0

謝謝!我需要做的就是添加額外的規則'header_stms:forward'來結束遞歸。 – Mike