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?
我是 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?