c++ - 使用 Boost Spirit 2 解析字符串以在用户定义的结构中填充数据

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

我正在使用 Boost.Spirit,它随 VS2005 的 Boost-1.42.0 一起发布。我的问题是这样的。

我有这个用逗号分隔的字符串。它的前 3 个字段是字符串,其余是数字。像这样。

String1,String2,String3,12.0,12.1,13.0,13.1,12.4

我的规则是这样的

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',')
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ;

我正在尝试将数据存储在这样的结构中。

struct MyStruct
{
   vector<string> stringVector ;
   vector<double> doubleVector ;
} ;

MyStruct var ;

我将它包裹在 BOOST_FUSION_ADAPT_STRUCTURE 中,以便使用它。

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector))

我的解析函数解析该行并在之后返回 true

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ;

我期待 var.stringVector 和 var.doubleVector 被正确填充。但事实并非如此。

出了什么问题?

代码示例位于here

提前致谢, 苏里亚

最佳答案

qi::skip_type 不是您可以使用 skipper 的东西。 qi::skip_type 是占位符 qi::skip 的类型,仅适用于 skip[] 指令(以在 lexeme[ ] 或更改正在使用的 skipper)并且它不是一个匹配任何输入的解析器组件。您需要指定您的特定 skipper 类型(在您的情况下是 boost::spirit::ascii:space_type)。

此外,为了让您的规则返回已解析的属性,您需要在定义规则时指定预期属性的类型。剩下的就是:

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ',');
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',');

这应该完全符合您的期望。

关于c++ - 使用 Boost Spirit 2 解析字符串以在用户定义的结构中填充数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2469861/

相关文章:

在 C 程序中使用的 C++ DLL

c++ - 自定义 STL 序列的最小嵌套 typedef 集?

c++ - boost::spirit 解析器返回空 vector

c++ - 元组 std::get() 不适用于变量定义的常量

c++ - 使用变量类型的 std::function 运行线程

c++ - 在vim中显示函数调用堆栈

macos - 我无法在 macOS Sierra 上使用 Homebrew 软件安装 solidity。安装在 boost 时挂起

c++ - 使用 Boost 的数值绑定(bind)库编译 C++ 代码来求解 Ax=b 线性系统

c++ - Boost Spirit Karma - 具有约束和传播失败的字符串输出 vector ?

c++ - 模板精神 X3 解析器