你应该能够接受空列表
line = label >> -(token % ',') >> eol;
请注意,如果您的船长也跳过 eol,eol 将不起作用(因此不要使用 qi::space,但例如 qi::blank 用于此目的)
另外,根据token 的定义,您也许应该将其更改为也接受“空”令牌
回应评论:一个完整的工作示例Live On Coliru
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
using namespace qi;
using It = std::string::const_iterator;
using Token = std::string;
using Tokens = std::vector<Token>;
rule<It, blank_type> label
= lexeme[+~char_(":")] >> ':'
;
rule<It, Token(), blank_type> token
= lexeme[*~char_(",\n")];
;
rule<It, Tokens(), blank_type> line
= label >> -(token % ',') >> eol
;
for (std::string const input : {
"my first label: 123, 234, 345 with spaces\n",
"1:\n",
"2: \n",
"3: ,,,\n",
"4: , \t ,,\n",
"5: , \t , something something,\n",
})
{
std::cout << std::string(40, '=') << "\nparsing: '" << input << "'\n";
Tokens parsed;
auto f = input.begin(), l = input.end();
bool ok = phrase_parse(f, l, line, blank, parsed);
if (ok)
{
std::cout << "Tokens parsed successfully, number parsed: " << parsed.size() << "\n";
for (auto token : parsed)
std::cout << "token value '" << token << "'\n";
}
else
std::cout << "Parse failed\n";
if (f != l)
std::cout << "Remaining input: '" << std::string(f, l) << "'\n";
}
}
输出:
========================================
parsing: 'my first label: 123, 234, 345 with spaces
'
Tokens parsed successfully, number parsed: 3
token value '123'
token value '234'
token value '345 with spaces'
========================================
parsing: '1:
'
Tokens parsed successfully, number parsed: 1
token value ''
========================================
parsing: '2:
'
Tokens parsed successfully, number parsed: 1
token value ''
========================================
parsing: '3: ,,,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value ''
token value ''
========================================
parsing: '4: , ,,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value ''
token value ''
========================================
parsing: '5: , , something something,
'
Tokens parsed successfully, number parsed: 4
token value ''
token value ''
token value 'something something'
token value ''