2010-08-28 3 views
8

Ho effettuato alcuni test utilizzando lo spirit mini_c sample. Purtroppo non mantiene la precedenza dell'operatore come previsto:Precedenza dell'operatore in boost :: spirit?

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

viene valutato come 0.

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

restituisce 1

ho provato a spostare la definizione di "||" e "& &" al vertice nel costruttore di

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

ma questo non cambia nulla. Come può essere risolto. Sto usando boost 1.3.38.

+0

Non ho mai usato Boost.Spirit, ma non lo faccio vedere come tutto ciò che definisce potrebbe fare la differenza qui. Non hai altro che primitive e non puoi sovraccaricare gli operatori integrati. –

+0

Ho un'altra domanda considerando questo esempio. Forse puoi aiutare anche con quello? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

risposta

7

Confermato, questo è un bug nell'esempio mini_c relativo alla precedenza degli operatori. Ho eseguito una correzione per SVN, che sarà disponibile in Boost V1.45. Ecco quello che ho cambiato nel file di intestazione mini_cb.hpp:

vecchio codice:

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

nuovo codice:

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

Grazie mille. Ho provato lo stesso, ma ho dimenticato di modificare i parametri all'interno delle definizioni. –

+1

Ciao Hartmut. Oggi - 1 1/2 anni dopo ho scoperto che il codice non è ancora corretto: "==" e "&&" devono essere valutati alla fine - DOPO "==" e "! =", Non prima. –