首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不跳过eol的情况下使用skipper ascii::space?

如何在不跳过eol的情况下使用skipper ascii::space?
EN

Stack Overflow用户
提问于 2012-05-06 04:38:33
回答 1查看 4.2K关注 0票数 9

我必须使用boost::spirit进行解析,并且我希望使用phrase_parse函数:

代码语言:javascript
复制
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol); 

但是我的编译器不允许使用第四个术语(ascii::space - qi::eol)。如何在不跳过eol的情况下使用skipper ascii::space?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-06 18:10:26

最简单的答案是

代码语言:javascript
复制
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank); 

当然,这也取决于你的语法:如果它需要一个特定的skipper类,你可能需要修改它。参见下面 generic 处理的方法(尽管您可以只为只接受qi::blank的语法指定qi::blank_type )。

该示例也可以处理任意的skippers。

其他提示

Spirit有几个影响skippers使用的指令:

  • qi::lexeme

将解析子表达式,而不考虑skipper (对于grammar)

  • qi::raw中的字符串文字而言非常有用

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

  • qi::no_skipqi::skip

可用于明确更改用于subexpression的跳线器的类型

推荐阅读

Boost Spirit站点有一篇很好的文章,介绍了这样的事情

  • Parsing Skippers and Skipping Parsers

通用样本

代码语言:javascript
复制
#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"));
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10465805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档