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,它会起作用。
如果我保存语法
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,它会起作用。