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

Gao*_*Gao 4 java antlr compilation

我想使用 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 : [ \t\r\n]+ -> skip;
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*ers 8

[...] 有什么方法可以使用 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以标记替代方案arg

arg
 : STRING     #StringArg
 | INTEGER    #IntegerArg
 | BOOLEAN    #BooleanArg
 | expression #ExpressionArg
 ;
Run Code Online (Sandbox Code Playgroud)

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

arg
 : STRING     #StringArg
 | INTEGER    #IntegerArg
 | BOOLEAN    #BooleanArg
 | expression #ExpressionArg
 ;
Run Code Online (Sandbox Code Playgroud)

而不是单一的T visitArg(RuleExpressionParser.ArgContext ctx)方法。