【问题标题】:ANTLR4 Mutually Left-recursive Error When Parsing C++ Source解析 C++ 源代码时 ANTLR4 相互左递归错误
【发布时间】:2013-04-20 10:12:33
【问题描述】:

我正在尝试解析 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解析语法时遇到了这个错误:

error(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在处理左递归规则时是否可以直接支持第一种语法?

【问题讨论】:

    标签: c++ grammar parser-generator antlr4 left-recursion


    【解决方案1】:

    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 ')'
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多