質問

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に修正を行いました。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)])
        )
    ;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top