2011-01-24 73 views
6

我正在寫一個lexigraphical分析器。它需要一個英文字符串,並將其轉換爲一組緯度/經度座標。這有點像谷歌地球。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_) 

這種分析,但degLat_和degLong_值不與字符串值一起反轉。它們只是直接解析到結構中,而不考慮字符串標籤。

如何建立一個結構(或升壓::融合表達載體)時,要分析的數據不連續?

回答

6

您有幾種可能性。最簡單的是你的結構改編成融合序列中所要求的順序:

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是你的精神語法用作屬性的數據類型:

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

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

這允許爲在同一時間同一結構創建若干調整。

相關問題