2010-07-06 5 views
2

Je suis à ma première expérience avec SableCC et la définition grammaticale. J'ai la grammaire suivante (une partie):décalage/réduire les conflits avec 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 ; 

je les erreurs suivantes:

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) 
} 

Je les ai résolu en ajoutant l_par et r_par à toutes les alternatives qui, par la voie , devrait augmenter la lisibilité mais est-il un moyen de le faire d'une manière élégante?

Merci.

Répondre

3

Donc, j'ai résolu le problème. Ce que j'ai fait est essentiellement de définir trois niveaux d'associativité.

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 ; 

Il est le schéma classique associativité +, * avec un opérateur unaire comme - où + = logic_or, * = logic_and, - = logic_not.