2011-01-24 170 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); 

这允许为在同一时间同一结构创建若干调整。

相关问题