如何在 ANTLR 的访问者模式下检查令牌的替代品?
How to check an alternative of a token in ANTLR's visitor mode?
我想使用 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;
如何知道 arg 是 STRING 或 INTEGER 或 BOOLEAN 或表达式?
[...] Is there some method which I can use switch statement?
您可以检查上下文的 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());
}
}
或者您可以 label 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) ...
而不是单一的 T visitArg(RuleExpressionParser.ArgContext ctx)
方法。
我想使用 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;
如何知道 arg 是 STRING 或 INTEGER 或 BOOLEAN 或表达式?
[...] Is there some method which I can use switch statement?
您可以检查上下文的 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());
}
}
或者您可以 label 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) ...
而不是单一的 T visitArg(RuleExpressionParser.ArgContext ctx)
方法。