我正在写一个lexigraphical分析器。它需要一个英文字符串,并将其转换为一组纬度/经度坐标。这有点像谷歌地球。
无论如何,我已经编写了符号表和语法,并且很高兴解析格式化数据。
struct LatLongDegrees
{
std::string dirLat_;
double degLat_;
std::string dirLong_;
double degLong_;
}
例如:{“North”,23.59,“East”,-30.82}
这是我的语法:
basic =(latitude >> ' ' >> double_ >> ' ' >> longitude >> ' ' >> double_);
纬度和经度是符号表,从速记罗盘方向映射到字符串(例如“e”到“东”)
所以,关于我的问题:
我想将以下规则添加到我的语法中,其中纬度和经度符号位于相反的位置:
reversed = (longitude >> ' ' >> double_ >> ' ' >> latitude >> double_ )
这解析,但是degLat_和degLong_值不会与字符串值一起反转。它们只是直接解析为结构,而不考虑字符串标签。
当要解析的数据不是连续的时,如何构建struct(或boost :: fusion向量)?
答案 0 :(得分: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);
这允许同时为同一个结构创建几个修改。