boost::spirit::qi::parse() 和 boost::spirit::qi::phrase_parse() 有何不同?

How do boost::spirit::qi::parse() and boost::spirit::qi::phrase_parse() differ?

我是 Qi 的新手。

我的目标是使用 spirit::qi 创建 CLI 解析器。 'CLI parser' 我不是指处理命令行选项(例如 app --help )的那种,而是处理用户输入的命令的那种。

示例:

CLI> vacuum on
vacuum solenoid energized
CLI> 

我一直在研究许多 spirit::qi 个例子并试图理解气。我看到qi提供了两个类似的API:qi::parse()和qi::phrase_parse()。我检查过的示例代码同时使用了这两种 API,但我还不明白它们有何不同。

换句话说,我认为这些 API 中的每一个都专门用于解决特定的解析任务,但我不明白,当尝试 select 这些 API 之一来解决特定的解析问题时,我应该选择一个。

提前致谢。

"straight" 解析 API 不接受船长,而 phrase_parse 接受。

船长是第二个解析器表达式,它描述了在词位之外要忽略的输入序列(如空格或注释,但不限于此)。

要了解船长的行为,请参见例如Boost spirit skipper issues

特别是它将表明您可以将 parse() 与内部使用 skippers 的语法一起使用,因为

ok = phrase_parse(f, l, grammar, skipper, attr);

大致相当于一个"smarter"内部定义它的文法:

ok = parse(f, l, qi::skip(skipper)[grammar], attr);

事实上,我会说在 99% 的情况下,这是正确的方法,因为船长通常是解析器的 属性,cannot/should 不会更改。遗憾的是,由于历史原因,文档示例经常使用 phrase_parse


奖金

一些命令语法解析的例子:

  • What is the correct way to use boost::qi::rule with BOOST_FUSION_ADAPT_STRUCT?