如何解决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 举报,一经查实,本站将立刻删除。