2012-12-04 82 views
1

我有以下的野牛文件 -或野牛聲明結構條件

%union 
{ 
    int integer_value; 
    double double_value; 
    char* string_value; 
} 

%token <integer_value> INTEGER 
%token <string_value> VAR 
%token <string_value> INTEGER_DECLARATION 
%token <double_value> DOUBLE 
%token <string_value> DOUBLE_DECLARATION 


%% 

program: 
     program statement '\n' 
     | 
     ; 

statement: 
     | INTEGER_DECLARATION VAR '=' INTEGER {//implementation} 

     | INTEGER_DECLARATION VAR '=' DOUBLE {//implementation as above}        

%% 

因爲在這兩種INTEGER_DECLARATION VAR '=' INTEGERINTEGER_DECLARATION VAR '=' DOUBLE實現是一樣的,是有可能使OR條件BW INTEGERDOUBLE在聲明結構?

我試過INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE,但它提示warning: rule useless in parser due to conflicts: statement: DOUBLE,實際上DOUBLE的提及被忽略。

回答

1

您發佈的主要代碼片段儘可能簡潔。 statement: INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE試圖說一個statement可以只包含一個DOUBLE

你可以這樣寫:

program: 
     program statement '\n' 
    | 
    ; 

statement: 
     decl_part INTEGER {//implementation uses info in $1} 
    | decl_part DOUBLE {//implementation as above}        
    ; 

decl_part: 
     INTEGER_DECLARATION VAR '=' {//partial implementation passes some info via $$} 
    ; 

,但它是值得商榷是否可以改善你有什麼了。

或者你可以寫:

program: 
     program statement '\n' 
    | 
    ; 

statement: 
     INTEGER_DECLARATION VAR '=' number 
    ; 

number: 
     INTEGER 
    | DOUBLE 
    ; 

這種技術有優點,當你以後想延長你的語言,例如,以支持十六進制的常數。

另外一個注意事項:我不認爲你要在製作中爲statement製作第一個替代符號。你的方式,programstatement可以是epsilon(空),我相信這會導致解析器衝突。