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) >> '(' >> ')';
使用 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) >> '(' >> ')';