6

私は辞書的アナライザーを書いています。英語の文字列を受け取り、それを一連の緯度/経度座標に変換します。Google Earth に少し似ています。

とにかく、記号表と文法を書き、書式設定されたデータを喜んで解析しています。

struct LatLongDegrees
{
 std::string  dirLat_;
 double   degLat_;
 std::string     dirLong_;
 double   degLong_;
}

例: {"北", 23.59, "東", -30.82}

これが私の文法です:

 basic =(latitude >> ' ' >> double_ >> ' ' >> longitude >> ' ' >> double_);

緯度と経度は、省略形のコンパス方向から文字列にマップするシンボル テーブルです (例: "e" から "East")。

それで、私の質問に進みます:

緯度と経度の記号が反対の位置にある次の規則を文法に追加したいと思います。

reversed = (longitude  >> ' ' >> double_ >> ' ' >> latitude >> double_ )

これは解析しますが、degLat_ と degLong_ の値は文字列値と一緒に反転されません。それらは、文字列ラベルに関係なく、単純に構造体に直接解析されます。

解析するデータがシーケンシャルでない場合、構造体 (または boost::fusion ベクトル) を構築するにはどうすればよいですか?

4

1 に答える 1

6

いくつかの可能性があります。最も簡単な方法は、必要な順序で構造体を Fusion シーケンスに適合させることです。

BOOST_FUSION_ADAPT_STRUCT(
    LatLongDegrees,
    (std::string, dirLong_)
    (double, degLong_)
    (std::string, dirLat_)
    (double, degLat_)
);

(はい、適応の順序は、元の構造体のメンバーの順序と一致する必要はありません。メンバーを省略したり、複製したりすることもできます)。メンバーを解析する特定の順序がある場合、これはうまく機能します。

同じプログラムで異なる順序付けが必要な場合は、同様の適応メカニズムを利用することをお勧めしますが、これにより、適応した構造体に名前を付けることができます。

BOOST_FUSION_ADAPT_STRUCT_NAME(
    LatLongDegrees, reversed_LatLongDegrees,
    (std::string, dirLong_)
    (double, degLong_)
    (std::string, dirLat_)
    (double, degLat_)
);

ここreversed_LatLongDegreesで、Spirit 文法で属性として使用されるデータ型は次のとおりです。

rule <Iterator, reversed_LatLongDegrees()> reversed;
reversed = longitude  >> ' ' >> double_ >> ' ' >> latitude >> double_;

LatLongDegrees data;
parse(begin, end, reversed, data);

これにより、同じ構造体に対して同時に複数の適応を作成できます。

于 2011-01-25T13:54:36.737 に答える