微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Boost::spirit::qi 解析替代变体

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

A="value1",B="value2"
B="value1",A="value2"

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

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;
}

解决方法

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

(("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

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

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

如果您想保持与之前相同的严格程度,您可以相对轻松地验证后解析。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。