首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost::spirit::qi解析替代变体

Boost::spirit::qi解析替代变体
EN

Stack Overflow用户
提问于 2021-07-01 04:10:54
回答 1查看 57关注 0票数 1

我需要用参数A和B解析字符串。参数的顺序没有定义。即字符串可以作为下一种格式之一出现

代码语言:javascript
复制
A="value1",B="value2"
代码语言:javascript
复制
B="value1",A="value2"

你可以在下面看到我的代码的一部分。但在该代码中,我只能解析A="value1",B="value2“变体。我可以修改这段代码来同时解析第一个和第二个变体吗?可以,我可以添加替代条件("|")。但是如果我需要解析新的C和D参数怎么办?

代码语言:javascript
复制
using Iterator = std::string::const_iterator;
qi::rule<Iterator, std::string()> quotedStringParser;
quotedStringParser %= ('"' >> +(qi::char_ - '"') >> '"');

std::string A;
std::string B;
bool isImport = false;

if (!qi::parse(begin(line), end(line),
    ("A=" >> quotedStringParser[px::ref(A) = qi::_1] >> ',' >> "B=" >> quotedStringParser[px::ref(B) = qi::_1]) >> qi::eoi
)) {
    return false;
}
EN

回答 1

Stack Overflow用户

发布于 2021-07-01 04:27:03

由于您希望能够将其扩展到任意数量的参数,因此更容易将其视为以逗号分隔的备选方案列表,每个备选方案都具有一个语义操作。这样,您就不必处理所有可能的排列。

代码语言:javascript
复制
(("A=" >> quotedStringParser[px::ref(A) = qi::_1]) | 
 ("B=" >> quotedStringParser[px::ref(B) = qi::_1]) |
 ("C=" >> quotedStringParser[px::ref(C) = qi::_1]) |
 ("D=" >> quotedStringParser[px::ref(D) = qi::_1]) ) % "," >> qi::eoi

然而,这是一个非常容错的解析器。

  • 不设置所有值是可以接受的,
  • 可以多次重新分配相同的值。

如果您想保持相同级别的严格程度,那么您可以相对轻松地验证后期解析。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68201075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档