标准ascii::space_type
船长当然不会跳过我的评论。文档中提到您可以创建自己的跳过解析器,但实际上没有示例如何实现它。
我只需要一个示例代码或任何内容,我现在已经在Google上搜索了2个小时。
请不要指向我examples,这几个有效的链接已经过时了,处理精神1.6。
答案 0 :(得分:31)
经过一些实验,我找到了一种指定自定义船长的方法,并在此处概述:
template<typename Iterator>
struct pl0_skipper : public qi::grammar<Iterator> {
pl0_skipper() : pl0_skipper::base_type(skip, "PL/0") {
skip = ascii::space | ('{' >> *(qi::char_ - '}') >> '}');
}
qi::rule<Iterator> skip;
};
template<typename Iterator, typename Skipper = pl0_skipper<Iterator>>
struct pl0_grammar : public qi::grammar<Iterator, Skipper> {
/* The rules use our skipper */
qi::rule<Iterator, Skipper> start;
qi::rule<Iterator, Skipper> block;
qi::rule<Iterator, Skipper> statement;
};
秘密在于解析器的调用。出于某种原因,当您想使用parse_phrase
解析它时,您必须提供一个skipper语法对象。我没有意识到这一点:
typedef std::string::const_iterator iterator_t;
typedef parser::pl0_grammar<iterator_t> grammar;
typedef parser::pl0_skipper<iterator_t> skipper;
grammar g;
skipper ws;
iterator_t iter = str.begin();
iterator_t end = str.end();
bool r = phrase_parse(iter, end, g, ws);
这很有效。