【发布时间】:2020-12-30 08:43:31
【问题描述】:
我正在熟悉 boost spirit v3。我想问的问题是如何说明您不想以任何方式使用跳过解析器这一事实。
考虑一个解析逗号分隔的整数序列的简单示例:
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/home/x3.hpp>
int main()
{
using namespace boost::spirit::x3;
const std::string input{"2,4,5"};
const auto parser = int_ % ',';
std::vector<int> numbers;
auto start = input.cbegin();
auto r = phrase_parse(start, input.end(), parser, space, numbers);
if(r && start == input.cend())
{
// success
for(const auto &item: numbers)
std::cout << item << std::endl;
return 0;
}
std::cerr << "Input was not parsed successfully" << std::endl;
return 1;
}
这完全没问题。但是,我想禁止在两者之间有空格(即 "2, 4,5" 不应该被很好地解析)。
我尝试在phrase_parse 中使用eps 作为跳过解析器,但您可以猜到,由于eps 匹配一个空字符串,因此程序最终进入了无限循环。
我找到的解决方案是使用no_skip 指令(https://www.boost.org/doc/libs/1_75_0/libs/spirit/doc/html/spirit/qi/reference/directive/no_skip.html)。所以解析器现在变成了:
const auto parser = no_skip[int_ % ','];
这很好用,但我认为它不是一个优雅的解决方案(尤其是在我不想跳过空格时在phrase_parse 中提供"space" 解析器)。有没有什么都不做的跳过解析器?我错过了什么吗?
感谢您的宝贵时间。期待任何回复。
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-x3