boost :: spirit中的运算符优先级?

时间:2010-08-28 14:45:17

标签: c++ parsing boost boost-spirit

我使用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。

1 个答案:

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