2016-03-29 7 views
0

alle!C++, boost :: spirit den text analysieren

Ich möchte boost :: spirit verwenden, um einige Zeichenfolge in Textdatei zu analysieren. Hier

ist die Probe in der Textdatei:

IF([banana] and [apple] and [yellow] or [green] or [red] and [!white]) 

THEN 

do sth...; 

ELSE 

do sth...; 

Wenn ich die Zeichenfolge in der „if“ Klammer analysieren bekam ich ein Problem.

Hier ist mein Code:

if_rule=str_p(IF)>>ch_p("(")>>if_mem>>*("and"|"or">>if_mem)>>ch_p(")"); 

if_mem=ch_p("[")>>*~ch_p("]")>>ch_p("]"); 

Es nicht analysieren work.It Dosis nur die zwei „und“ von Anfang an und ignorieren die „oder“.

Ich habe mehrere verschiedene grammer versucht und immer noch nicht funktioniert.

Vielen Dank für Ihre Hilfe!

+0

http://en.cppreference.com/w/cpp/language/operator_precedence – llonesmiz

+0

@jv_ Vielen Dank! In boost :: spirit, bitweise "oder" bedeutet logisch "oder". Kann einige Bitmaps erstellen, um die Grammatik zu überprüfen tritt auf oder nicht. – zdczdcc

+0

'(" und "|" oder ")' konnte nicht kompiliert werden. Und ich habe neue Probleme. 'ruleA =! ruleB &&! ruleC', wie könnte ich es in boost :: spirit ausdrücken – zdczdcc

Antwort

0

Sie müssen daran denken, dass ein Spirit-Ausdruck letztlich nur ein (wirklich hässlicher) C++ - Ausdruck ist und somit den C++ - Regeln folgen muss. Unabhängig von der Bedeutung, die Spirit den Operatoren gibt, folgen sie immer noch c++ operator precedence rules. Und so "and" | "or" >> if_mem der Ausdruck ist nicht die gleiche wie ("and" oder "or"), gefolgt von if_mem aber in der Tat ist "and" oder ("or" gefolgt von if_mem) seit >> hat eine höhere Priorität als |. Wenn Sie ("and"|"or")>>if_mem verwenden, sehen Sie sich einem anderen separaten Problem gegenüber: Da keines seiner Argumente ein Spirit-Ausdruck ist, ist der Operator | nicht der alternative Parser, sondern der standardmäßige C++ bitwise_or-Operator, der einen Compilerfehler verursacht. Die Lösung in diesem Fall ist, mindestens eines der Argumente zu einem Spirit-Ausdruck zu machen, indem man (ich rate nur, da ich Spirit.Classic nicht verwende) etwas wie (str_p("and")|str_p("or"))>>if_mem verwendet. (Ich denke, "and">>if_mem | "or">>if_mem sollte auch funktionieren, aber es ist wahrscheinlich eine schlechtere Alternative).

Wie in seinem Kommentar erwähnt, sollten Sie, wenn Sie die Wahl haben (sofern Sie nicht grundsätzlich mit altem Code arbeiten müssen), Spirit v2 verwenden, da es viel einfacher ist, Hilfe zu bekommen.