【问题标题】:How do I get boost::spirit to stop parsing at keyword?如何让 boost::spirit 在关键字处停止解析?
【发布时间】:2014-01-06 19:03:24
【问题描述】:

我想解析像“start abc end”这样的输入来提取“abc”。

这是我的测试代码:

#include <boost/spirit/include/qi.hpp>
#include <ostream>

namespace qi = boost::spirit::qi;

int main(int argc, char* argv[])
{
    typedef std::string::const_iterator iterator;

    qi::rule<iterator, std::string(), qi::space_type> rule =
        "start" >>
        qi::lexeme[+qi::char_] >>
        "end";

    std::string input("start  abc end");
    auto iter = input.begin();
    std::string result;
    qi::phrase_parse(iter, input.end(), rule, qi::space, result);

    std::cout << "Result:   " << result   << std::endl;
}

输出是“结果:abc end”。

【问题讨论】:

  • 请注意,如果您要检查qi::phrase_parse 的结果,您会看到解析失败。
  • 我注意到了这一点并假设因为“end”被提前消耗,解析器无法完成匹配。
  • 我无法编译您的代码,您使用的是哪个版本的 boost?

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


【解决方案1】:

问题是,您希望解析器在空格或关键字“end”处停止。但是您的解析器基本上接受“start”关键字之后的任何字符。

+char_

解析器上面的意思是:任何长于1的字符序列(包括空格)。

您必须以某种方式告诉您的解析器在空格或“end”关键字处停止。例如下面的解析器将接受字符直到“end”关键字

+(char_ - lit("end"))

我建议您查看精神文档中的解析器列表。 http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers.html

【讨论】:

  • 感谢您的回答,但没有帮助。将规则更改为 qi::rule rule = "start" >> qi::lexeme[+qi::char_] - qi::lit("end" ) >> "结束";产生了同样的结果。
  • 我相信应该是这样的"start" &gt;&gt; qi::lexeme[+qi::char_ - qi::lit("end")] &gt;&gt; "end"
  • 这是一个我还没有尝试过的排列,但它没有帮助。还有吗?
  • +(qi::char_ - qi::lit("end")) 是一个解决方案
  • 成功了!你很接近@HeyYO。如果您编辑答案,我会接受。
猜你喜欢
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多