2

これはおそらく悲惨なほど簡単な質問です。特に、QIを使用して単純な構造を解析することに成功しており、おそらくすでに答えを知っているはずですが、それでもわかりません...

次のようなコンテナがあるとします。

struct GenderTally
{
 std::vector<std::string> males;
 std::vector<std::string> females;
};

とのような入力ファイル

m:Steve;
f:Dora;
f:Martha;
m:Joe;
...

特定のカテゴリのオブジェクトが任意の順序で表示され、すべてのオブジェクトが表示されるとは限りません。

ここではFusionの適応をスキップしますが、文字列の2つのベクトルになります。

私の問題は、そのような条件付きコンテナを満たす文法を構築することです。これまで、特殊な文法を使用して入力を複数回解析することで、この問題を回避してきました。この例では、それは男性と女性になります。

QI mini-XMLチュートリアルでは、自動ルールがセマンティックアクションを取り除くという印象を受けましたが、確かに、私は新人であり、QIが使用するようなハードコア(テンプレート)マジックAPIにまだ恐れを感じています。それで、私はそれが悪い、悪い形であることを知っていても...私はヘッドライトの閉塞でいくつかの主要な鹿を経験しているので、ここで実際の実用的な例を得ることができて本当に感謝しています。編集:この構造体に正確に対応している必要はありません。自動ルールを使用し、適切なバケットに配置する文法の実際的な例です。

4

1 に答える 1

5

あなたの場合、私がすることはこれです:

BOOST_FUSION_ADAPT_STRUCT(
    GenderTally,
    (std::vector<std::string>, males)
    (std::vector<std::string>, females)
);

rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g = 
    *(   ("f:" >> r)[phx::push_back(at_c<0>(_val), _1)] 
     |   ("m:" >> r)[phx::push_back(at_c<1>(_val), _1)]
     );

良くありませんが、それでもあなたが持っているものに対処する最も簡単な方法です。

別のデータ構造がある場合、

struct Gender {
    char gender;
    std::string name;
};

typedef std::vector<Gender> GenderTally;

BOOST_FUSION_ADAPT_STRUCT(
    Gender,
    (char, gender)
    (std::string, name)
);

あなたはそれを別の方法で書くことができます:

rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r);

ただし、このコードはSVNトランクでのみ機能する可能性があります。これは、最近コミットされた属性処理に多くの修正が加えられているためです。

欠点は、男性と女性を分類するために別個の後処理ステップが必要になることです。

于 2011-03-22T13:44:00.140 に答える