gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:31:22 32 4
gpt4 key购买 nike

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

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

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

最佳答案

最简单的答案是

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

当然,这也取决于您的语法:如果它需要一个特定的 skipper 类,您可能需要更改它。 请参阅下面的通用方法来处理该问题(尽管您可以为只应接受的语法指定qi::blank_type qi::空白).

该示例也处理任意 skipper 。

其他提示

Spirit 有几个指令会影响 skipper 的使用:​​

  • qi::lexeme

    无论 skipper 如何都将解析子表达式(例如对语法中的字符串文字很有用)

  • qi::raw

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

  • qi::no_skip , qi::skip

    可用于显式更改用于子表达式的 skipper 类型

推荐阅读

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

关于c++ - 如何在不跳过 eol 的情况下使用 skipper ascii::space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465805/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com