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

antlr4:为什么'tree'不能用作规则名称?,antlr,antlr4,Antlr,Antlr4,如果我保存语法 grammar L; tree: 't' ; a: tree | 'b' ; 在文件名L.g4和调用antlr4 L.g4(版本4.7.1)中,它输出一条无法理解的错误消息,没有任何行号或列号: 五十、 g4:::语法错误:字符“|”不匹配,应为“g” :部分是错误的行号/列号通常出现的地方 如果我不存钱 grammar L; tre: 't' ; a: tre | 'b' ; 当L.g4并在其上运行antlr4时,它运行时不会出错 树标识符有什么问题?未在以下列表中列出

如果我保存语法

grammar L;

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

五十、 g4:::语法错误:字符“|”不匹配,应为“g”

部分是错误的行号/列号通常出现的地方

如果我不存钱

grammar L;

tre: 't' ;
a: tre | 'b' ;
L.g4
并在其上运行
antlr4
时,它运行时不会出错

标识符有什么问题?未在以下列表中列出:

导入、片段、lexer、解析器、语法、返回、, 局部变量、抛出、捕获、最终、模式、选项、标记

是一个。我猜文档可能不完整,也可能是一个bug。文档中还提到了不能用作规则名称的非关键字(如单词
规则
),因此
可能类似-不是真正的关键字,但不允许到处使用

根据这一点,如果删除
之间的空格,它就可以工作

同样似乎仍然相关,它似乎很乐意在Java代码中将未替换的规则名称用作方法名称:
public final bobbyTables上下文bobbyTables()
。如果我使用
throw
private
而不是
bobbyTables
,我想不会有什么好结果。谢谢,在选择规则名称时,我会尽量小心一点。(轻微更正:
throw
实际上生成了漂亮的错误消息。)