Приоритет оператора в 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.

8
задан Nicolas Kaiser 7 December 2011 в 16:14
поделиться

1 ответ

Подтверждено, это ошибка в примере 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)])
        )
    ;
7
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: