0

我正在尝试解析 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在处理左递归规则时是否可以直接支持第一种语法呢?

4

1 回答 1

4

ANTLR 4 支持直接左递归,但不支持间接或隐藏左递归。您可以通过显式扩展可选构造来解决上述情况。

direct_abstract_declarator
   :   direct_abstract_declarator '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
   |   direct_abstract_declarator '[' constant_expression? ']'
   |   '(' parameter_declaration_clause ')' cv_qualifier_seq? exception_specification?
   |   '[' constant_expression? ']'
   |   '(' abstract_declarator ')'
;
于 2013-04-20T16:00:35.517 回答