让我们假设您的语法具有不区分大小写的foo
令牌,如下所示:
FOO : F O O ;
fragment F:('f'|'F');
fragment O:('o'|'O');
对于此令牌Vocabulary.getLiteralName(token)返回null
,因为它是通过匹配模式而非文字值来定义的。
Antlr4是否有内置方法为语法定义中的foo
标记指定文字值?
答案 0 :(得分:1)
getSymbolicName(int)
应返回FOO
输入"foo"
:
TLexer lexer = new TLexer(new ANTLRInputStream("foo"));
for (Token token : lexer.getAllTokens()) {
System.out.println(TLexer.VOCABULARY.getSymbolicName(token.getType()));
}
答案 1 :(得分:1)
几乎每个ANTLR4运行时类都有一个toString()方法。对于像(解析)树和识别上下文这样的分层元素,子条目列在toString()输出中,但通常使用某种形式的格式(如逗号分隔列表)。
所以答案是:不。没有内置方法可以将子树的文本作为单个无格式字符串。然而,编写串联函数是微不足道的。只需创建一个函数getText(RuleContext context),它返回一个字符串并迭代上下文的子节点,并在每个上下文中调用getText()(或使用词汇表),然后从值中返回一个连接的字符串。