boost::spirit::qi 和顺序无关变量

6

我正在编写一个词法分析器。它接收一个英文字符串,并将其转换为一组纬度/经度坐标。它有点像谷歌地球。

无论如何,我已经编写了我的符号表和语法,它可以愉快地解析格式化数据。

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_值没有随着字符串值反转。它们直接被解析到结构体中,而没有考虑字符串标签。

当要解析的数据不是连续的时,如何构建一个结构体(或boost::fusion向量)?

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_)
);

在您的Spirit语法中,reversed_LatLongDegrees是用作属性的数据类型:

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

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

这可以同时创建相同结构的几个适配器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接