我使用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。
答案 0 :(得分:7)
确认,这是与运营商优先级相关的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)])
)
;