Java 如何访问ANTLR lexer令牌

Java 如何访问ANTLR lexer令牌,java,antlr,antlr4,Java,Antlr,Antlr4,我已指定以下ANTLR语法: 表达式:。。。 |提取器=提取器“('setElementDefinition','expression')”#setExtractorExp | ... ; 提取器:“选择” |“选择”; 我想知道在解析这个表达式时我处理的是哪种类型的提取。 一种方法是将提取器字段与包含提取器类型的字符串进行比较,如下所示: @覆盖 公共表达式VisitSetTextRactOreXP(MyParser.SetExtractorExpContext ctx){ 如果(ctx.e

我已指定以下ANTLR语法:

表达式:。。。
|提取器=提取器“('setElementDefinition','expression')”#setExtractorExp
| ... ;
提取器:“选择”
|“选择”;
我想知道在解析这个表达式时我处理的是哪种类型的提取。 一种方法是将提取器字段与包含提取器类型的字符串进行比较,如下所示:

@覆盖
公共表达式VisitSetTextRactOreXP(MyParser.SetExtractorExpContext ctx){
如果(ctx.extractor.getText().equals(“选择”){…}
}
但是我不想在这里重复提取器的名称,以防以后我选择更改提取器的名称。 那么有没有办法访问lexer令牌呢


我正在想象这样的事情:如果(ctx.extractor==MyLexer.extractor.choose)

现在,你的
提取器只有一种类型,使
选择
选择
几乎一样。区别的唯一方法是像您已经做的那样进行字符串比较。如果您不想这样做,请执行以下操作:

表达式
: ...
|提取器“('setElementDefinition','expression')”#setExtractorExp
| ... 
;
提取器
:选择
|选择
;
选择:“选择”;
选择:“选择”;
在你的访客中:

@覆盖
公共表达式VisitSetTextRactOreXP(MyParser.SetExtractorExpContext ctx){
如果(ctx.extractor().start.getType()==MyLexer.SELECT){…}
else if(ctx.extractor().start.getType()==MyLexer.CHOOSE){…}
}
这样,您就不必复制(魔法)字符串