gpt4 book ai didi

c++ - 使用 Boost Spirit Qi 解析分隔的 token 列表

转载 作者:太空狗 更新时间:2023-10-29 21:19:40 24 4
gpt4 key购买 nike

使用 boost::spirit::qi 我正在尝试解析由标签和后跟可变数量的分隔标记组成的行。我使用 phrase_parse 调用语法并使用提供的 blank 解析器作为跳过解析器来保留换行符,因为我需要确保标签是每行的第一项。

简单的基本情况:

label token, token, token

可以用语法解析:

line = label >> (token % ',') >> eol;

我面临的问题是语法应该接受零个或多个标记,并且标记可能为空。语法应接受以下行:

label
label ,
label , token
label token, , token,

我还没有设法创建接受上述所有示例的语法。关于如何解决这个问题有什么建议吗?

编辑:

感谢 sehe 就上述问题提供的所有意见。现在是我忘记包括的有趣部分......语法还应该接受空行和拆分行。 (没有标签的代币)当我尝试将标签设置为可选时,我得到了一个匹配空字符串的无限循环。

label

label token
token

最佳答案

你应该能够接受空列表

line = label >> -(token % ',') >> eol;

请注意,如果您的 skipper 也跳过 eol,eol 将不起作用(所以不要使用 qi::space,而是例如 qi::blank 用于此目的)

此外,根据 token 的定义,您也许应该将其更改为也接受“空” 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 ''

关于c++ - 使用 Boost Spirit Qi 解析分隔的 token 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com