【问题标题】:Boost::spirit::qi parse alternative variantBoost::spirit::qi 解析替代变体
【发布时间】:2021-06-30 20:10:54
【问题描述】:

我需要解析带有参数 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;
}

【问题讨论】:

  • 我只是知道这与stackoverflow.com/questions/68174743/…有关。我没有勇气回答这个问题:请不要以复杂的方式来做。把你的顾虑分开。自上而下解析syntax*,扫描/解析后做语义验证。
  • 这就是语法被设计成可扩展的方式,它使您的代码更快、更易于维护、更不容易出错(参见例如stackoverflow.com/questions/67873608/… vs. stackoverflow.com/questions/2958747/…)。哦,它可能会编译得更快。
  • 总而言之,有operator^ - 我有几个答案在这个网站上展示了这种方法,但遗憾的是,搜索在找到这些方法方面非常糟糕......使用“置换”作为搜索进行更新关键字帮助:stackoverflow.com/search?q=user%3A85371+permutation+qi 也许谷歌有更好的结果。
  • 你好@sehe,是的,你说得对。问题是相关的。我删除了旧问题。最后,我将所有参数解析为 std::map,并为属性附加检查编写逻辑。

标签: c++ c++11 boost-spirit boost-spirit-qi boost-phoenix


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的回复。你说“这都是你可以相对容易地验证后解析的东西。”。你能解释一下,我该怎么做?我是最新的 boost,所以我不知道该怎么做。
  • 这与@sehe 所说的关注点分离基本相同。如果您关心确保 A、B、C 和 D 都已设置,请不要将其作为解析器的一部分。解析完成后检查它们是否都有值。
  • @ВалентинНикин 另外,这更多的是见仁见智(因此为什么它不是答案的一部分),在你的鞋子里,我会解析 std::map&lt;std::string, std::string&gt;&gt; 并分配给 A,解析完成后的 B,C,D。这样编译速度会快很多,并且可以“免费”扩展到任意数量的键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多