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的值会发生变化。

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

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

lexer grammar SearchLexer;
options { tokenVocab = Search; }
...

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

相关内容

  • 没有找到相关文章

最新更新