2011-11-01 107 views
2

野牛抱怨「衝突:1班/減少」。我看不出有什麼問題。請幫忙。謝謝,野牛抱怨「衝突:1班/減少」

%token OR AND NUMBER 
%% 

search_condition: 
     |  search_condition AND search_condition { printf(" AND "); } 
     |  '(' search_condition ')' 
     |  predicate 
     ; 

predicate: 
       NUMBER { printf("%d\n", $1); } 
     ; 
+1

我不使用Bison/Yacc的經驗,但是你的'search_condition'匹配空字符串(epsilon):'search_condition:/ * epsilon */| search_condition AND ...',也許刪除第一個管道? 'search_condition:search_condition AND ...'? –

+0

添加%並解決了問題。謝謝 – johnsam

回答

8

衝突意味着你給野牛的語法不是LALR(1),因此它不能決定採取何種行動,每一個可能的情況下,爲了正確地解析語法。

就你而言,問題在於你的語法不明確。如果你給它像

NUMBER AND NUMBER AND NUMBER 

輸入它不能決定它是否應該分析它等同於

(NUMBER AND NUMBER) AND NUMBER 

NUMBER AND (NUMBER AND NUMBER) 

有許多的方法可以解決此問題:

  • 您可以使用%left AND%right AND告訴野牛,它應該把AND爲左或右關聯管道符

  • 可以重構search_condition規則,使其明確:

    search_condition : search_condition AND primary 
           | primary 
           ; 
    primary : '(search_condition ')' 
         | predicate 
         ;