c++ - boost::spirit::qi 和乱序变量

标签 c++ boost boost-spirit boost-spirit-qi

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

不管怎样,我的符号表和语法都写好了,解析格式化数据也很开心。

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

例如:{"北", 23.59, "东", -30.82}

这是我的语法:

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

其中纬度和经度是从速记罗盘方向映射到字符串(例如“e”到“East”)的符号表

那么,关于我的问题:

我想在我的语法中添加以下规则,其中纬度和经度符号位于相反的位置:

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

这会解析,但 degLat_ 和 degLong_ 值不会与字符串值一起反转。它们只是直接解析到结构中,而不考虑字符串标签。

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

最佳答案

你有几种可能性。最简单的方法是按照要求的顺序将您的结构调整为 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);

这允许同时为同一结构创建多个改编。

关于c++ - boost::spirit::qi 和乱序变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4788470/

相关文章:

c++ - 为什么使用 boost::ice_or 而不是 ||和 boost::ice_and 而不是 enable_if 中的 &&?

c++ - Spirit 无法将属性分配给单元素结构(或 fusion 序列)

c++ - 你如何访问 unique_ptr 的 vector

c++ - 创建节点数组

c++ - 如何捕获由 boost::spirit::x3 解析器解析的值以在语义操作体内使用​​?

c++ - Boost Spirit 罗马数字解析器示例

c++ - 为什么 adjacency_list<> 中 <> 为空

c++ - 如何使用boost::karma/qi解析日期时间?

c++ - Boost Spirit Visual C++ 编译器错误,适用于 GCC

Android AIML 机器人?