2013-06-01 71 views
0

所以我用我的語法有可怕的移位/減少錯誤。這裏有一個最小的測試用例:野牛:固定移位/減少錯誤,不知道如何

%token PLUS MINUS TIMES DIVIDE NUMBER 
%token EQUAL NEQUAL GREATER LESS NOT 

%left EQUAL NEQUAL 
%left GREATER LESS 
%left PLUS MINUS 
%left TIMES DIVIDE 
%left UMINUS NOT 

%% 

exp    : exp binop exp 
       | unop exp 
       | NUMBER 
       ; 

binop   : MINUS 
       | PLUS 
       | TIMES 
       | DIVIDE 
       | EQUAL 
       | NEQUAL 
       | GREATER 
       | LESS 
       ; 

unop   : MINUS %prec UMINUS 
       | NOT 
       ; 

%% 

然而,通過實驗我總算使問題消失:

%token PLUS MINUS TIMES DIVIDE NUMBER 
%token EQUAL NEQUAL GREATER LESS NOT 

%left EQUAL NEQUAL 
%left GREATER LESS 
%left PLUS MINUS 
%left TIMES DIVIDE 
%left UMINUS NOT 

%% 

exp    : binops 
       | unops 
       | NUMBER 
       ; 

unops   : MINUS exp %prec UMINUS 
       | NOT exp 
       ; 

binops   : exp MINUS exp 
       | exp PLUS exp 
       | exp TIMES exp 
       | exp DIVIDE exp 
       | exp EQUAL exp 
       | exp NEQUAL exp 
       | exp GREATER exp 
       | exp LESS exp 
       ; 

%% 

任何人都可以解釋爲什麼我有移進/歸約擺在首位的錯誤和爲什麼這個工作?這甚至是一個合適的解決方案?如果不是,那是什麼?

回答

2

在您的第一個語法中,優先級聲明絕對沒有任何作用。優先級僅適用於包含終端的替代方案,優先級爲:在你的第一個語法中,這將是binopunop的作品。但是這些作品的替代品是完全不含糊的;優先順序不需要決定將​​減少到binop

在您的第二個語法中,優先關係確實有效,因爲競爭性的模糊替代(binopsunops的生成)直接包含終端。

換句話說,優先級不會「查看」非終端。