Frage

Ich habe einige Tests den Geist mini_c Probe verwendet wird. Leider hat es nicht den Operator Vorrang behalten, wie erwartet:

int main()
{
    return 3 > 10 || 3 > 1;
}

auswertet auf 0

return (3 > 10) || (3 > 1);

Rückgabe 1

Ich habe versucht, die Definition zu bewegen „||“ und „&&“ bis ganz nach oben im Konstruktor von

template <typename Iterator>
expression<Iterator>::expression(

, aber das ändert nichts. Wie kann das behoben werden. Ich bin mit Boost-1.3.38.

War es hilfreich?

Lösung

bestätigt, dass ein Fehler in dem mini_c Beispiel ist zu Operatorpräzedenz verwendet. Ich verpflichten, eine Lösung zu SVN, die Boost-V1.45 zur Verfügung stehen wird. Hier ist, was ich in der Header-Datei mini_cb.hpp geändert:

alter Code:

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

Neuer Code:

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)])
        )
    ;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top