2

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

}

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

4

1 回答 1

1

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

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

lexer grammar SearchLexer;

options { tokenVocab = Search; }

...

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

于 2013-04-03T00:26:19.563 回答