2010-07-06 49 views
2

我在SableCC和語法定義的第一次經歷。 我有以下的語法(的一部分):轉移/減少與SableCC的衝突

query = 
      {atop} attroperator | 
      {query_par} l_par query r_par | 
      {query_and} [q1]:query logic_and [q2]:query | 
      {query_or} [q1]:query logic_or [q2]:query | 
      {query_not} logic_not query ; 

我有以下錯誤:

shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on 
TRPar in { 
     [ PQuery = PQuery * TRPar ] (shift), 
     [ PQuery = TLogicNot PQuery * ] followed by TRPar (reduce) 
} 

shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on 
TLogicAnd in { 
     [ PQuery = PQuery * TLogicAnd PQuery ] (shift), 
     [ PQuery = TLogicNot PQuery * ] followed by TLogicAnd (reduce) 
} 

shift/reduce conflict in state [stack: PCommand TLogicNot PQuery *] on 
TLogicOr in { 
     [ PQuery = PQuery * TLogicOr PQuery ] (shift), 
     [ PQuery = TLogicNot PQuery * ] followed by TLogicOr (reduce) 
} 

我解決了他們加入l_par和r_par所有替代它,由 方式,應該增加可讀性,但有沒有辦法以優雅的方式來做到這一點?

謝謝。

回答

3

所以,我已經解決了這個問題。我所做的基本上定義了三個關聯性級別。

query = 
    {query_or} query logic_or term | 
    {query_term} term ; 

term = 
    {term_and} term logic_and factor | 
    {term_factor} factor ; 

factor = 
    {atop} attroperator | 
    {query_not} logic_not attroperator | 
    {query_par} l_par query r_par ; 

這是典型的關聯性方案+,*與一元運算符一樣 - 在+ = logic_or* = logic_and- = logic_not