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