我正在编写一个词法分析器。它接受一个英文字符串,并将其转换为一组纬度/经度坐标。它有点像 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/