【发布时间】:2020-08-03 17:44:03
【问题描述】:
就像Boost.Spirit 上的描述一样,lexeme 和 no_skip 之间的唯一区别是 pre_skip。
但经过一些测试,我仍然对 pre_skip 的确切含义感到困惑。
那么什么样的条件会有所不同,也许举个例子可以帮助我更好地理解它。
谢谢!
【问题讨论】:
标签: c++ boost boost-spirit
就像Boost.Spirit 上的描述一样,lexeme 和 no_skip 之间的唯一区别是 pre_skip。
但经过一些测试,我仍然对 pre_skip 的确切含义感到困惑。
那么什么样的条件会有所不同,也许举个例子可以帮助我更好地理解它。
谢谢!
【问题讨论】:
标签: c++ boost boost-spirit
预跳过忽略表达式开头的空格。
对比:
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
static std::string const input = " 42j";
int main() {
auto run_test = [](auto p) {
auto f = input.begin(), l = input.end();
int i;
return qi::phrase_parse(f, l, p, qi::space, i)
? std::to_string(i)
: "unparsed";
};
std::cout << "no_skip: " << run_test(qi::no_skip[ qi::int_ >> 'j' ]) << "\n";
std::cout << "lexeme: " << run_test(qi::lexeme[ qi::int_ >> 'j' ]) << "\n";
}
打印:
no_skip: unparsed
lexeme: 42
如您所见,lexeme 会默默地吃掉领先的空白。 这是预跳过。
【讨论】: