2013-12-20 146 views
1

我不知道如何解決位移/減少這種語法衝突實例化我的課:轉變/減少我的野牛語法衝突

%start root_instance 

%token IDENTIFIER 
%token FUNCTION 
%token FUNCTION_CHUNK 
%token NOBIND 
%token PROPERTY_CHUNK 
%token MULTILINE_PROPERTY_CHUNK 

%% 

id_comma_list: 
    id_comma_list IDENTIFIER { 
    } 
    | id_comma_list ',' IDENTIFIER { 
    } 
    | %empty { $$ = id_list(); } 
; 

id_dot_list: 
    id_dot_list IDENTIFIER { 
    } 
    | id_dot_list '.' IDENTIFIER { 
    } 
    | %empty { $$ = id_list(); } 
; 

root_instance: 
    id_dot_list '{' instance_body '}' { 
    } 
; 

instance: 
    id_dot_list '{' instance_body '}' { 
    } 
; 

instance_body: 
    instance_body instance { 
    } 
    | instance_body function { 
    } 
    | instance_body property { 
    } 
    | %empty { $$ = node(); } 
; 

function: 
    FUNCTION IDENTIFIER '(' id_comma_list FUNCTION_CHUNK { 
    } 
; 

property: 
    IDENTIFIER PROPERTY_CHUNK { 
    } 
    | IDENTIFIER MULTILINE_PROPERTY_CHUNK { 
    } 
    | IDENTIFIER NOBIND PROPERTY_CHUNK { 
    } 
    | IDENTIFIER NOBIND MULTILINE_PROPERTY_CHUNK { 
    } 
; 
%% 

衝突出現在「instance_body」規則。解析器無法決定是將IDENTIFIER移入「屬性」還是縮小爲「id_dot_list」。我嘗試啓用GLR解析器,該解析器可能可以解析此語法,但是bison中存在一個錯誤,當啓用GLR時會導致錯誤。我不想引入任何新的關鍵字,例如「財產」,這將緩解是否轉移的決定。

回答

0

這似乎這樣做,換擋時會出現IDENTIFIER強制,固定的矛盾:

%start root_instance 

%token IDENTIFIER 
%token FUNCTION 
%token FUNCTION_CHUNK 
%token NOBIND 
%token PROPERTY_CHUNK 
%token MULTILINE_PROPERTY_CHUNK 

%% 

id_comma_list: 
    id_comma_list IDENTIFIER { 
    } 
    | id_comma_list ',' IDENTIFIER { 
    } 
    | %empty { $$ = id_list(); } 
; 

id_dot_list: 
    id_dot_list IDENTIFIER { 
    } 
    | id_dot_list '.' IDENTIFIER { 
    } 
    | %empty { $$ = id_list(); } 
; 

root_instance: 
    id_dot_list '{' instance_body '}' { 
    } 
; 

instance_or_property: 
    id_dot_list '{' instance_body '}' { 
    } 
    | property { 
    } 
; 

instance_body: 
    instance_body IDENTIFIER instance_or_property { 
     $$ = ::std::move($1); 
    } 
    | instance_body function { 
    } 
    | %empty { $$ = node(); } 
; 

function: 
    FUNCTION IDENTIFIER '(' id_comma_list FUNCTION_CHUNK { 
    } 
; 

property: 
    PROPERTY_CHUNK { 
    } 
    | MULTILINE_PROPERTY_CHUNK { 
    } 
    | NOBIND PROPERTY_CHUNK { 
    } 
    | NOBIND MULTILINE_PROPERTY_CHUNK { 
    } 
;