2011-01-24 13 views
6

私は字句解析ツールを書いています。それは英語の文字列を取り、それを緯度経度座標に変換します。それはGoogle Earthのようなものです。boost :: spirit :: qiと順序外変数

とにかく、私はシンボルテーブルと文法を書いています。フォーマットされたデータをうまく解析しています。

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

例えば:{ "北"、23.59、 "東"、-30.82}ここ

は私の文法:緯度と経度からマッピングシンボルテーブルである

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

文字列への速記コンパスの向き(例えば「E」を「東」)

だから、私の質問への:

私は、緯度と経度の記号が反対の位置にある私の文法に次のルールを追加したい:

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

これは解析し、BUT degLat_とdegLong_値は文字列値と一緒に逆転されていません。文字列ラベルに関係なく、構造体に直接解析されます。

解析するデータがシーケンシャルでない場合、どのようにstruct(またはboost :: fusion vector)をビルドするのですか?

答えて

6

あなたはいくつかの可能性があります。最も簡単には、必要な順序で融合配列にあなたの構造体を適応させることである。

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

(はい、適応のためには、元の構造体のメンバの順序と一致する必要はありません、あなたも省くことができますメンバーを複製するか、それらを複製する)。あなたのメンバーを解析したい特定の注文が1つあればうまくいきます。

同じプログラムで異なる順序が必要な場合は、同様の適応メカニズムを使用することもできますが、適応構造体:

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

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

これは、同じ時間に同じ構造体のいくつかの適応を作成することができます:reversed_LatLongDegreesはあなたの精神の文法で属性として使用されるデータ型です

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

関連する問題