2010-08-28 11 views
8

Hice algunas pruebas con la muestra spirit mini_c. Por desgracia, no se mantiene la prioridad de los operadores como se esperaba:Prioridad del operador en boost :: spirit?

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

evalúa a 0.

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

devuelve 1

Traté de mover la definición de "||" y "& &" a lo más alto en el constructor de

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

pero eso no cambia nada. ¿Cómo puede ser arreglado? Estoy usando boost 1.3.38.

+0

nunca he utilizado Boost.Spirit, pero no lo hago ver cómo cualquier cosa que define podría hacer la diferencia aquí. No tiene nada más que primitivos, y no puede sobrecargar los operadores integrados. –

+0

Tengo otra pregunta considerando esta muestra. ¿Quizás también puedas ayudar con eso? http://stackoverflow.com/questions/3591533/implementing-not-in-boostspirit-mini-c –

Respuesta

7

Confirmado, eso es un error en el ejemplo mini_c relacionado con la precedencia del operador. Apliqué una solución a SVN, que estará disponible en Boost V1.45. Esto es lo que ha cambiado en el archivo de cabecera mini_cb.hpp:

código antiguo:

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

nuevo código:

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

Muchas gracias. Intenté lo mismo, pero olvidé modificar los parámetros dentro de las definiciones. –

+1

Hola Hartmut. Hoy - 1 1/2 años después descubrí que el código aún no es correcto: "==" y "&&" deben evaluarse al fin, DESPUÉS de "==" y "! =", No antes. –

Cuestiones relacionadas