ANTLR4 是否支持为令牌分配文字名称?

Does ANTLR4 support assigning a literal name to a token?

假设您的语法不区分大小写 foo 标记定义如下:

FOO : F O O ;

fragment F:('f'|'F');
fragment O:('o'|'O');

对于此标记 Vocabulary.getLiteralName(token) returns null 因为它是通过匹配模式而不是文字值来定义的。

Antlr4 是否有内置的方法来为语法定义中的 foo 标记指定文字值?

getSymbolicName(int) 应该 return FOO 输入 "foo":

TLexer lexer = new TLexer(new ANTLRInputStream("foo"));

for (Token token : lexer.getAllTokens()) {
  System.out.println(TLexer.VOCABULARY.getSymbolicName(token.getType()));
}

几乎每个 ANTLR4 运行时都有一个 toString() 方法 class。对于(解析)树和识别上下文等分层元素,子条目列在 toString() 输出中,但通常使用某种形式的格式(如逗号分隔列表)。

所以,答案是:没有。没有内置方法可以将子树的文本作为单个未格式化的字符串获取。然而,编写串联函数是微不足道的。只需创建一个函数 getText(RuleContext context) ,该函数 returns 一个字符串,它遍历上下文的子项并在每个子项上调用 getText() (或使用词汇表),然后 returns 一个串联的来自值的字符串。