如何在ANTLR的访问者模式下检查令牌的替代品?



我想使用ANTLR的访问者模式构建一个简单的规则引擎,但当它涉及到替代令牌时,我很困惑如何获得哪个替代令牌。有人能帮我吗?(对不起我英语不好(

grammar RuleExpression;
expression: '(' Operator arg* ')';
arg: STRING|INTEGER|BOOLEAN|expression;
STRING: '"' .+ '"';
INTEGER: [0-9]+;
BOOLEAN: 'true'|'false';
Operator: [a-zA-Z]+[0-9]*;
WS : [ trn]+ -> skip;

如何知道arg是STRING、INTEGER、BOOLEAN或表达式?

[…]有什么方法可以使用switch语句吗?

您可以检查上下文的start令牌类型:

@Override
public Object visitArg(RuleExpressionParser.ArgContext ctx) {
switch (ctx.start.getType()) {
case RuleExpressionLexer.STRING:
return ...;
case RuleExpressionLexer.INTEGER:
return ...;
case RuleExpressionLexer.BOOLEAN:
return ...;
default:
// It was an `expression`
return super.visitExpression(ctx.expression());
}
}

或者你可以给arg替代品贴上标签:

arg
: STRING     #StringArg
| INTEGER    #IntegerArg
| BOOLEAN    #BooleanArg
| expression #ExpressionArg
;

这将导致访问者有以下方法:

@Override 
public T visitStringArg(RuleExpressionParser.StringArgContext ctx) ...
@Override 
public T visitIntegerArg(RuleExpressionParser.IntegerArgContext ctx) ...
@Override 
public T visitBooleanArg(RuleExpressionParser.BooleanArgContext ctx) ...
@Override 
public T visitExpressionArg(RuleExpressionParser.ExpressionArgContext ctx) ...

而不是单一的CCD_ 3方法。

最新更新