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

时间:2013-04-03 00:17:40

标签: java antlr4

默认情况下,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);
    }   

}

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

1 个答案:

答案 0 :(得分:1)

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

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

lexer grammar SearchLexer;

options { tokenVocab = Search; }

...

然后,生成的SearchLexer.java类将包含public static final intLOCATION的常量(GENDER),因为它们是由tokenVocab选项导入的。