我正在尝试解析 cpp 源语法的一个子集。以下 ANTLR4 解析器规则直接从 c++ 语言规范中复制而来(连字符被下划线代替):
abstract_declarator:
ptr_operator abstract_declarator?
| direct_abstract_declarator
;
direct_abstract_declarator:
direct_abstract_declarator? '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| direct_abstract_declarator? '[' constant_expression? ']'
| '(' abstract_declarator ')'
;
但是当 org.antlr.v4.Tool 解析语法时出现此错误:
错误(119):cppProcessor.g4::: 以下规则集是相互左递归的 [direct_abstract_declarator]
好像是direct_abstract_declarator?左侧的语法会导致错误。我应该如何纠正它?为什么ANTLR4不支持?
手动将规则重构为这种形式不会产生错误:
direct_abstract_declarator:
direct_abstract_declarator '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
| direct_abstract_declarator '[' constant_expression? ']'
| '[' constant_expression? ']'
| '(' abstract_declarator ')'
那么ANTLR4在处理左递归规则时是否可以直接支持第一种语法呢?