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 一个串联的来自值的字符串。
假设您的语法不区分大小写 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 一个串联的来自值的字符串。