C++ boost::spirit::qi 递归规则

C++ boost::spirit::qi recursive rule

使用 boost::spirit::qi,假设您正在尝试解析如下内容:

object.member()

您可以使用如下规则:

member_access_rule =
symbol_rule >> '.' >> symbol_rule >> '(' >> ')'
;

但是,如果你想解析怎么办:

object.member().member()

object.member().member().member()

看起来,您会按照以下几行使用规则:

member_access_rule =
  ( member_access_rule >> '.' >> symbol_rule >> '(' >> ')' )
| ( symbol_rule >> '.' >> symbol_rule >> '(' >> ')' )
;

但这不起作用。

在上面的形式中,'member_access_rule' 中的第一个子规则是它本身,因此对 'member_access_rule' 的递归调用将堆积起来,而不会尝试匹配替代项。

我该如何解决这个问题?

如有任何建议,我们将不胜感激!

是的,PEG 容易受到臭名昭著的 left-recursion。

我只是将规则重构为

member_access_rule = 
  ( symbol_rule >> '.' >> symbol_rule >> '(' >> ')' )
| ( member_access_rule >> '.' >> symbol_rule >> '(' >> ')' )
;

或者,就此而言:

member_access_rule = 
  symbol_rule >> +('.' >> symbol_rule) >> '(' >> ')';