2016-03-29 9 views
0

皆さん!C++、boost :: spiritはテキストを解析します

テキストファイルの一部の文字列を解析するためにboost :: spiritを使用します。私はブラケットが、私はトラブルを得た「IF」で文字列を解析する場合

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

THEN 

do sth...; 

ELSE 

do sth...; 

:ここ

は、テキストファイルのサンプルです。

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

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

それはちょうど「または」2「と」最初のを解析し、無視work.Itない線量:

は、ここに私のコードです。

私はいくつかの異なる文法を試してきましたが、まだ動作しませんでした。

ありがとうございました!

+0

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

+0

@jv_ありがとうございます!boost :: spiritでは、bitwiseまたはorは論理的な意味を持ちます。または、起こるかどうか。 – zdczdcc

+0

'("と "|"または ")'はコンパイルできませんでした。 'ruleA =!ruleB &&!ruleC'、どうすればboost :: spiritで表現できますか? – zdczdcc

答えて

0

最終的にスピリットの表現は(実際には醜い)C++表現であり、したがってC++の規則に従う必要があることに注意する必要があります。スピリットがオペレータに与える意味とは無関係に、彼らはまだc++ operator precedence rulesに従います。そのため式"and" | "or" >> if_memif_mem続い("and"又は"or")と同じではなく>>|がより高い優先順位を有しているので、実際に"and"又は(if_mem続い"or")です。 ("and"|"or")>>if_memを使用する場合は別の問題に直面します:その引数のどれもSpirit式でないため、演算子|は代替パーサではなく、デフォルトのC++ bitwise_or演算子であり、発見したようにコンパイラエラーが発生します。この場合の解決策は、(私はSpirit.Classicを使用しないので推測しています)(str_p("and")|str_p("or"))>>if_memのようなものを使用して、少なくとも1つの引数をSpirit式にすることです。 (私は"and">>if_mem | "or">>if_memもうまくいくはずだが、おそらくはもっと悪い選択肢かもしれない)。

あなたの選択肢がある場合(基本的に従来のコードで作業する必要がない限り)、Spirit v2を使用すべきでしょう。

関連する問題