解析c++源代码时相互左递归错误
ANTLR4 Mutually Left-recursive Error When Parsing C++ Source
我正在尝试解析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。工具正在解析语法:
错误(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是否有可能直接支持第一种语法?
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 ')'
;
相关文章:
- C++:正在检查LinkedList中的回文-递归方法-错误
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 递归求和任务的错误答案
- 为什么我的递归代码给出 sigsegv 错误?
- 任何人都可以查明我的递归函数中的错误吗?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 对可变参数函数的递归调用的链接器错误
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- 递归树遍历/分支删除的隔离错误
- Fibbonaci 递归代码返回错误值,始终返回下一个数字
- 为什么使用递归lambda时会遇到编译错误
- 使用递归方法遇到分段错误
- 分段错误(核心转储)错误C++递归调用
- 尝试"复制"shared_ptr向上转换行为会导致复制构造函数上的无限递归(导致段错误)
- C++子集和2^n/递归错误/澄清
- 为什么通过引用传递可以修复我的递归错误
- 解析c++源代码时相互左递归错误