antlr4:为什么 `tree` 不能用作规则名称?

antlr4: why is `tree` unusable as a rule name?

如果我保存语法

grammar L;

tree: 't' ;
a: tree | 'b' ;

在文件名 L.g4 中调用 antlr4 L.g4(版本 4.7.1),它输出了一条没有任何行号或列号的无法理解的错误消息:

L.g4::: syntax error: mismatched character '|' expecting 'g'

::: 部分通常是 line/column 错误编号所在的位置。

如果我改为保存

grammar L;

tre: 't' ;
a: tre | 'b' ;

as L.g4 和 运行 antlr4 就可以了,运行没有错误。

tree 标识符有什么问题?它未在 reserved keywords 列表中列出:

import, fragment, lexer, parser, grammar, returns, locals, throws, catch, finally, mode, options, tokens

tree 是一个 reserved keyword in ANTLR v3。我想文档可能不完整或者它可能是一个错误。该文档还提到不能用作规则名称的非关键字(如单词 rule),因此 tree 可能是相似的 - 不是真正的关键字但不允许在任何地方使用。

根据此 unresolved ANTRL4 bug report for your issue,如果您删除 tree: 之间的 space,它会起作用。