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

ANTLR4是否支持将文字名称分配给令牌?,antlr,antlr4,Antlr,Antlr4,假设语法中定义了不区分大小写的foo标记,如下所示: FOO : F O O ; fragment F:('f'|'F'); fragment O:('o'|'O'); 因为该标记是通过匹配模式而不是文本值定义的,所以返回null Antlr4是否有一种内置方式来指定语法定义中的foo标记的文字值?getSymbolicName(int)应为输入foo返回foo: 几乎在每个ANTLR4运行时类中都有一个toString()方法。对于层次结构元素,如(parse)树和识别上下文,子项列在to

假设语法中定义了不区分大小写的
foo
标记,如下所示:

FOO : F O O ;

fragment F:('f'|'F');
fragment O:('o'|'O');
因为该标记是通过匹配模式而不是文本值定义的,所以返回
null

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

getSymbolicName(int)
应为输入
foo
返回
foo

几乎在每个ANTLR4运行时类中都有一个toString()方法。对于层次结构元素,如(parse)树和识别上下文,子项列在toString()输出中,但通常采用某种格式(如逗号分隔列表)


因此,答案是:没有。没有内置的方法将子树的文本作为单个未格式化字符串获取。然而,编写一个串联函数并不重要。只需创建一个函数getText(RuleContext context),该函数返回一个字符串,并对上下文的子级进行迭代,对每个子级调用getText()(或使用词汇表),然后从值中返回一个连接的字符串。

谢谢。这就是我一直在使用的技术,根据某种约定从符号名派生出文字名。但对于偏离约定的代币,需要进行特殊处理。我希望在我的代码中消除特殊处理的需要。“但是对于偏离约定的令牌,需要特殊处理。”-只是好奇,在哪种情况下,
getSymbolicName(…)
不会给出预期的结果?
getSymbolicName
总是正确运行;我只是想把标记名和文字名分离开来。我一直使用的惯例是将
大写下划线
转换为
点分隔的小写字母
。现在我想说的是,有些标记的文字值包含空格,我不想说“两个下划线在一行中表示使用空格而不是点”。啊,好的,我明白了。谢谢。我更关心的是单个标记而不是子树,但这很好!即使是lexer标记也可以包含子树。毕竟,单个节点也是子树(只是没有子节点)。
TLexer lexer = new TLexer(new ANTLRInputStream("foo"));

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