默认情况下,token.getType()
方法返回int
,并且在没有加载和解析生成的*.tokens
文件的情况下基于代码是无用的。
ANTLR用户通常如何一致地使用令牌类型?我的意思是一致的是,如果你改变语法,令牌号很可能会改变。
您是否通常创建一个Utility
类来加载*.tokens
文件并对其进行解析?
我的样本Search.tokens
文件:
LOCATION=8
TIME=5
AGE=3
WS=1
COMPARATIVE=9
GENDER=4
PHRASE=2
示例令牌流:
(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);
}
}
然后我总是可以通过LOCATION
或GENDER
之类的名称引用我的令牌,而不必担心会发生变化的Integer
值。
答案 0 :(得分:1)
生成词法分析器和/或解析器时,生成的类将包含语法中声明的每个标记类型的常量以及通过标记文件导入的标记类型。
例如,如果您有以下语法:
lexer grammar SearchLexer;
options { tokenVocab = Search; }
...
然后,生成的SearchLexer.java
类将包含public static final int
和LOCATION
的常量(GENDER
),因为它们是由tokenVocab
选项导入的。