2010-08-28 3 views
8

Ich habe einige Tests mit der spirit mini_c Probe gemacht. Leider hat halten sie den Betreiber nicht Vorrang wie erwartet:Betreiber Vorrang in Boost :: Geist?

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

wertet auf 0.

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

gibt 1 zurück

Ich habe versucht, die Definition von "||" zu bewegen und „& &“ bis ganz nach oben in den Konstruktor

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

aber das ändert nichts. Wie kann das behoben werden? Ich benutze Boost 1.3.38.

+0

Ich habe noch nie Boost.Spirit verwendet, aber ich weiß nicht Sehen Sie, wie etwas, das es definiert, möglicherweise hier einen Unterschied machen könnte. Sie haben nichts als Primitive, und Sie können die eingebauten Operatoren nicht überladen. –

+0

Ich habe eine andere Frage in Anbetracht dieser Probe. Vielleicht kannst du damit auch helfen? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

Antwort

7

Bestätigt, das ist ein Fehler im mini_c-Beispiel, der sich auf die Vorrangstellung des Operators bezieht. Ich habe eine Reparatur an SVN vorgenommen, die in Boost V1.45 verfügbar sein wird. Hier ist, was ich in der Header-Datei mini_cb.hpp geändert:

alter 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)]) 
     ) 
    ; 

neuer 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

Vielen Dank. Ich habe das gleiche versucht, aber ich habe vergessen, die Parameter in den Definitionen zu ändern. –

+1

Hallo Hartmut. Heute - 1 1/2 Jahre später habe ich festgestellt, dass der Code immer noch nicht korrekt ist: "==" und "&&" müssen zuletzt ausgewertet werden - NACH "==" und "! =", Vorher nicht. –