我使用 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)])
)
;
关于c++ - boost::spirit 中的运算符优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3591146/