2010-08-28 4 views
8

J'ai fait quelques tests en utilisant l'échantillon spirit mini_c. Malheureusement, il ne tient pas la priorité des opérateurs comme prévu:Priorité d'opérateur dans boost :: spirit?

int main() 
{ 
    return 3 > 10 || 3 > 1; 
} 

est évaluée à 0.

return (3 > 10) || (3 > 1); 

retourne 1

J'ai essayé de déplacer la définition de "||" et « & & » au très haut dans le constructeur de

template <typename Iterator> 
expression<Iterator>::expression(

mais cela ne change rien. Comment cela peut-il être réparé? J'utilise boost 1.3.38.

+0

Je ne l'ai jamais utilisé Boost.Spirit, mais je ne voyez comment tout ce qu'il définit pourrait faire une différence ici. Vous n'avez rien d'autre que des primitives, et vous ne pouvez pas surcharger les opérateurs intégrés. –

+0

J'ai une autre question compte tenu de cet échantillon. Peut-être que vous pouvez aider avec ça aussi? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

Répondre

7

Confirmé, c'est un bogue dans l'exemple de mini_c lié à la priorité de l'opérateur. J'ai commis une correction à SVN, qui sera disponible dans Boost V1.45. Voici ce que j'ai changé dans le fichier d'en-tête mini_cb.hpp:

ancien code:

equality_expr = 
    relational_expr 
    >> *( ("==" > relational_expr  [op(op_eq)]) 
     | ("!=" > relational_expr  [op(op_neq)]) 
     ) 
    ; 

relational_expr = 
    logical_expr 
    >> *( ("<=" > logical_expr  [op(op_lte)]) 
     | ('<' > logical_expr   [op(op_lt)]) 
     | (">=" > logical_expr  [op(op_gte)]) 
     | ('>' > logical_expr   [op(op_gt)]) 
     ) 
    ; 

logical_expr = 
    additive_expr 
    >> *( ("&&" > additive_expr  [op(op_and)]) 
     | ("||" > additive_expr  [op(op_or)]) 
     ) 
    ; 

nouveau code:

equality_expr = 
    logical_expr 
    >> *( ("==" > logical_expr  [op(op_eq)]) 
     | ("!=" > logical_expr  [op(op_neq)]) 
     ) 
    ; 

logical_expr = 
    relational_expr 
    >> *( ("&&" > relational_expr  [op(op_and)]) 
     | ("||" > relational_expr  [op(op_or)]) 
     ) 
    ; 

relational_expr = 
    additive_expr 
    >> *( ("<=" > additive_expr  [op(op_lte)]) 
     | ('<' > additive_expr  [op(op_lt)]) 
     | (">=" > additive_expr  [op(op_gte)]) 
     | ('>' > additive_expr  [op(op_gt)]) 
     ) 
    ; 
+0

Merci beaucoup. J'ai essayé la même chose, mais j'ai oublié de modifier les paramètres dans les définitions. –

+1

Bonjour Hartmut. Aujourd'hui - 1 ans et demi plus tard, j'ai découvert que le code n'est toujours pas correct: "==" et "&&" doivent être évalués en dernier - APRÈS "==" et "! =", Pas avant. –