我如何使用ASCII船长::空间没有跳过停产?(How can I use the skipper

2019-06-24 04:31发布

我不得不使用boost ::精神解析,我想用phrase_parse功能:

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol); 

但第四项(ASCII ::空间 - 齐:: EOL),心不是我的编译器允许的。 我如何使用ASCII船长::空间没有跳过停产?

Answer 1:

最简单的答案是

qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank); 

当然,这取决于你的语法太:如果它希望你可能需要更改特定的船长类。 请参阅下面的一种通用的方法来处理 (尽管你可以只指定qi::blank_type的语法应该只接受qi::blank )。

样品处理任意船长了。

其他提示

精神具有影响使用船长的几个指令:

  • qi::lexeme

    将解析子表达无论船长的(对于例如字符串文字有用的语法)

  • qi::raw

    将返回原始源迭代范围,意思就是跳过输入将被包括在结果

  • qi::no_skipqi::skip

    可以用来明确地改变用于子表达式船长的类型

推荐阅读

升压精神站点提供有关的东西像这样的好文章

  • 解析船长和跳解析器

通用示例

#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"));
}


文章来源: How can I use the skipper ascii::space WITHOUT skipping eol?