gpt4 book ai didi

java - Antlr4 创建更有意义/一致的类型名称

转载 作者:行者123 更新时间:2023-11-30 11:34:13 25 4
gpt4 key购买 nike

默认情况下,token.getType() 方法返回一个 int,如果不加载和解析 *.tokens,它对基于此的代码毫无用处 生成的文件。

ANTLR 用户通常如何一致地使用 token 类型?我所说的一致的意思是,如果您更改语法,则标记编号很可能会发生变化。

您通常会创建一个 Utility 类来加载 *.tokens 文件并解析它吗?

我的示例 Search.tokens 文件:

LOCATION=8
TIME=5
AGE=3
WS=1
COMPARATIVE=9
GENDER=4
PHRASE=2

示例 token 流:

(token.getType(), token.getText())
9 [MegaBlocks vs Legos], -1 [<EOF>]

目前我正在做类似的事情:

public class TokenMapper {

private HashMap<Integer, String> tokens;

public TokenMapper(String file) {
tokens = new HashMap<Integer, String>();
parse(file);
}

private void parse(String file) {
// trivial code that maps the Integer typeId to the String name
}

public Integer type(String type) {
for(Map.Entry<Integer, String> entry : tokens.entrySet()) {
if(entry.getValue().equals(type)) {
return entry.getKey();
}
}
return null;
}

public String type(Integer type) {
return tokens.get(type);
}

}

然后我总是可以通过诸如 LOCATIONGENDER 之类的名称来引用我的 token ,而不必担心 Integer 值往往会发生变化。

最佳答案

当您生成词法分析器和/或解析器时,生成的类将包含语法中声明的每个标记类型的常量以及通过标记文件导入的标记类型。

例如,如果您有以下语法:

lexer grammar SearchLexer;

options { tokenVocab = Search; }

...

然后生成的 SearchLexer.java 类将包含 LOCATIONGENDER 的常量 (public static final int) > 因为它们是通过 tokenVocab 选项导入的。

关于java - Antlr4 创建更有意义/一致的类型名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15776801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com