我需要使用boost::spirit进行解析,我想使用phrase_parse函数:
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);
但是第四个术语(ascii::space - qi::eol)在我的编译器中不被允许。 如何使用跳过器ascii::space而不跳过eol?
我需要使用boost::spirit进行解析,我想使用phrase_parse函数:
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);
但是第四个术语(ascii::space - qi::eol)在我的编译器中不被允许。 如何使用跳过器ascii::space而不跳过eol?
最简单的答案是
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::blank);
qi::blank
的语法指定qi::blank_type
)。将解析子表达式,而不考虑跳过器(在语法中使用字符串字面量时非常有用)
将返回原始源迭代器范围,意味着跳过的输入将包含在结果中
可用于显式更改用于子表达式的跳过器类型
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"));
}
std::string()
),Skipper会去哪里? - Kerrek SBqi::blank_type
,即使子标记不需要知道关于eol
的信息。我想这是因为我还没有像一个灵魂一样思考。 - alfC
ascii::space - qi::eol
有什么问题?这会对可能的解决方案产生很大影响。 - Mahmoud Al-Qudsi