我使用ANTLR4将一种语言翻译成另一种语言。例如,当我读取数字时,我可以返回一个整数
或双精度浮点数
。
@Override
public Integer visitIntegerValue(Parser.IntegerValueContext ctx) {
return Integer.valueOf(ctx.getText());
}
@Override
public Double visitDoubleValue(Parser.DoubleValueContext ctx) {
return Double.valueOf(ctx.getText());
}
如果你进一步扩展这种方法并引入其他构造,如字符串和条件语句,则访问者唯一合理的类型是class Visitor extends BaseVisitor<Object>
,但它会导致代码大量使用instanceof
。例如:
@Override
public CollectionQuery visitCondition(Parser.ConditionContext ctx) {
Property property = (Property) visit(ctx.property());
String operator = (String) visit(ctx.operator());
Object value = visit(ctx.amount());
Object condition;
if (value instanceof String && operator.equals("$regex")) {
condition = Pattern.compile((String) value, Pattern.CASE_INSENSITIVE);
}
...
}
虽然我不介意这种“动态性”,但我想知道这是否是一种可维护的方法,或者是否应该使用其他技术,例如创建目标语言结构的适当层次结构。