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

时间:2017-02-20 21:00:07

标签: c++ boost boost-spirit

使用boost :: spirit :: qi,假设您正在尝试解析类似这样的内容:

evt.isControlDown();
evt.isAltDown();
evt.isShiftDown();

您可以使用以下规则:

object.member()

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

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

object.member().member()

看起来,你会沿着这些方向使用规则:

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

但这不起作用。

在上面的编队中,'member_access_rule'中的第一个子规则本身就是这样,因此对'member_access_rule'的递归调用将会堆积而不会尝试匹配替代方案。

我怎样才能解决这个问题?

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

是的,PEG容易受到臭名昭着的左递归的影响。

我只是将规则重构为

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

或者,就此而言:

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