【问题标题】:How can I extract a std::string with boost.spirit?如何使用 boost.spirit 提取 std::string?
【发布时间】:2010-10-20 00:58:04
【问题描述】:

使用 boost.spirit 我尝试解析 command:param1 param2... 形式的简单命令行

为此,我创建了这个解析器:

(+(char_ - ':'))[ref(cmd) = _1]
>> ':'
>> (*char_)[ref(params) = _1]

这两个复合解析器的属性类型是vector,所以如果cmd和params是vector类型的就可以了。但是,如果它们是 std::string 类型,则不是。在网上搜索此解决方案时,我发现提示它也应该与字符串一起使用。无论如何我可以使用字符串来完成这项工作吗?

【问题讨论】:

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


    【解决方案1】:

    当然,当您使用语义操作时,不会发生自动属性传播。您的两个解析器(+(char_ - ':')*char_)都公开了一个 std::vector<char> 作为它们的属性。因此,_1 也指的是std::vector<char>。如果cmdparamsstd::string 的实例,则不会编译,因为没有定义从std::vector<char>std::string 的赋值。

    但是,如果您摆脱语义操作,它将起作用:

    std::string s("command:param1 param2");
    std::string cmd, params;
    parse(s.begin(), s.end(), +~char_(':') >> ':' >> *char_, cmd, params);
    

    这不仅更简单,而且更快。解析器会将匹配的字符直接放入提供的字符串中。

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      相关资源
      最近更新 更多