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

标签 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。

最佳答案

已确认,这是 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/

相关文章:

c++ - 增加访问量可能存在错误

c++ - << 未找到运算符和无法识别的转义序列

c++ - 为 Rad Studio 更新 boost 库

java - Java 中的字符串到日期

javascript - 使用 JavaScript 解析两者之间的信息

c++ - boost::posix_time::ptime 存储在 Windows 共享内存映射中是否安全?

c++ - boost 程序选项 - 如何有条件地键入位置参数?

c++ - Qt、按钮、id 属性?任何知道点击哪个按钮的方法

c# - 如何编写MIDI(乐器数字接口(interface))应用程序?

python - 用 Python 解析文本文件?