默认情况下,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
的值会发生变化。
当您生成lexer和/或解析器时,生成的类将包含语法中声明的每个令牌类型以及通过令牌文件导入的令牌类型的常量。
例如,如果您有以下语法:
lexer grammar SearchLexer;
options { tokenVocab = Search; }
...
然后,生成的SearchLexer.java
类将包含LOCATION
和GENDER
的常量(public static final int
(,因为它们是由于tokenVocab
选项而导入的。