【发布时间】: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