使用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'的递归调用将会堆积而不会尝试匹配替代方案。
我怎样才能解决这个问题?
任何建议将不胜感激!
答案 0 :(得分:2)
是的,PEG容易受到臭名昭着的左递归的影响。
我只是将规则重构为
member_access_rule =
( symbol_rule >> '.' >> symbol_rule >> '(' >> ')' )
| ( member_access_rule >> '.' >> symbol_rule >> '(' >> ')' )
;
或者,就此而言:
member_access_rule =
symbol_rule >> +('.' >> symbol_rule) >> '(' >> ')';