ANTLR4标记了大量关键字
我想在语法中嵌入一些已知的标识符名称,例如,我的项目的类名是已知的,我想告诉lexer哪些标识符是实际属于类名令牌的已知关键字。但是由于我有一个很长的类名列表(数百个名称),我不想通过在规则中列出所有已知的类名关键字来创建类名lexer规则,这会使我的语法文件太大 是否可以将我的关键字放在一个单独的文件中?我考虑的一种可能性是将关键字放在一个java类中,该类将由生成的lexer类进行子类化。在这种情况下,我的lexer的语义谓词可以只调用自定义lexer超类中的一个方法,以验证输入标记是否与我的长名称列表匹配。我的长列表可以放在超类src代码中ANTLR4标记了大量关键字,antlr4,Antlr4,我想在语法中嵌入一些已知的标识符名称,例如,我的项目的类名是已知的,我想告诉lexer哪些标识符是实际属于类名令牌的已知关键字。但是由于我有一个很长的类名列表(数百个名称),我不想通过在规则中列出所有已知的类名关键字来创建类名lexer规则,这会使我的语法文件太大 是否可以将我的关键字放在一个单独的文件中?我考虑的一种可能性是将关键字放在一个java类中,该类将由生成的lexer类进行子类化。在这种情况下,我的lexer的语义谓词可以只调用自定义lexer超类中的一个方法,以验证输入标记是否与我
然而,在ANTLR4的书中,它说组合语法的语法选项“超类”只设置解析器的超类。如果我仍然想使用组合语法,如何设置lexer的超类。或者有没有其他更好的方法将我的长关键字列表放入一个单独的“关键字文件”中。如果您希望每个关键字都有自己的令牌类型,可以执行以下操作:
private static final Map<String, Integer> KEYWORDS =
new HashMap<String, Integer>();
static {
KEYWORDS.put("keyword1", MyLanguageParser.Keyword1);
KEYWORDS.put("keyword2", MyLanguageParser.Keyword2);
...
}
public static int getKeywordOrIdentifierType(String text) {
Integer type = KEYWORDS.get(text);
if (type == null) {
return MyLanguageParser.Identifier;
}
return type;
}
tokens{}
块添加到语法中,为每个关键字创建标记。这确保为每个关键字创建唯一的令牌类型
tokens {
Keyword1,
Keyword2,
...
}
MyLanguageKeywords
,如下所示:
private static final Map<String, Integer> KEYWORDS =
new HashMap<String, Integer>();
static {
KEYWORDS.put("keyword1", MyLanguageParser.Keyword1);
KEYWORDS.put("keyword2", MyLanguageParser.Keyword2);
...
}
public static int getKeywordOrIdentifierType(String text) {
Integer type = KEYWORDS.get(text);
if (type == null) {
return MyLanguageParser.Identifier;
}
return type;
}