我如何使用船长ascii :: space没有跳过eol?

Hen*_*ain 9 c++ parsing boost boost-spirit boost-spirit-qi

我必须使用boost :: spirit进行解析,我想使用phrase_parse函数:

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol); 
Run Code Online (Sandbox Code Playgroud)

但是我的编译器不允许第四个术语(ascii :: space - qi :: eol).我如何使用船长ascii :: space没有跳过eol?

seh*_*ehe 15

最简单的答案是

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank); 
Run Code Online (Sandbox Code Playgroud)

当然,这也取决于你的语法:如果它需要特定的队长类,你可能需要改变它.请参阅下面的一般处理方法(尽管您可以指定qi::blank_type只接受的语法qi::blank).

该示例也处理任意的队长.

其他提示

Spirit有几个指令影响了船长的使用:

  • qi::lexeme

    将解析子表达式而不管skipper(对于例如语法中的字符串文字有用)

  • qi::raw

    将返回原始源迭代器范围,这意味着跳过的输入将包含在结果中

  • qi::no_skip, qi::skip

    可用于明确更改用于子表达式的队列的类型

推荐阅读

Boost Spirit网站有一篇关于此类内容的好文章

通用样本

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

namespace qi = boost::spirit::qi;

template <typename It, typename Skipper>
    struct parser : qi::grammar<It, Skipper>
{
    parser() : parser::base_type(start)
    {
        start = *qi::int_;
    }

  private:
    qi::rule<It, Skipper> start;
};

template <typename C, typename Skipper>
    void doParse(const C& input, const Skipper& skipper)
{
    auto f(std::begin(input)), l(std::end(input));

    parser<decltype(f), Skipper> p;
    bool ok = qi::phrase_parse(f,l,p,skipper);

    if (ok)   
        std::cout << "parse success\n";
}

int main()
{
    const std::string input = "1 2 3 4";
    doParse(input, qi::blank);
    doParse(input, qi::space);
    doParse(input, ~qi::char_("0-9"));
}
Run Code Online (Sandbox Code Playgroud)