Я сделал несколько тестов, используя образец spirit mini_c. К сожалению, он не сохраняет приоритет оператора, как ожидалось:
int main()
{
return 3 > 10 || 3 > 1;
}
оценивает как 0.
return (3 > 10) || (3 > 1);
возвращает 1
] Я попытался переместить определения «||» и «&&» на самый верх в конструкторе
template <typename Iterator>
expression<Iterator>::expression(
, но это ничего не меняет. Как это можно исправить. Я использую boost 1.3.38.
Подтверждено, это ошибка в примере mini_c, связанная с приоритетом операторов. Я внес исправление в SVN, которое будет доступно в Boost V1.45. Вот что я изменил в заголовочном файле mini_cb.hpp:
старый код:
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)])
)
;
новый код:
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)])
)
;