【问题标题】:boost::spirit::qi and out-of-sequence variablesboost::spirit::qi 和乱序变量
【发布时间】:2011-06-14 21:06:45
【问题描述】:

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

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

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

例如:{"North", 23.59, "East", -30.82}

这是我的语法:

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

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

那么,关于我的问题:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    这允许同时为同一个结构创建多个适配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多