我使用ANTLR4将一种语言翻译成另一种语言。例如,当我阅读数字文字时,我可以返回Integer
或Double
。
@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);
}
...
}
尽管我不介意这种“动态性”,但我想知道这是否是一种可维护的方法,还是我应该使用其他技术来代替,例如创建目标语言结构的适当层次结构。
一种建议是让每个返回类型都有一个访问者:
public class IntegerVisitor extends BaseListener<Integer> {
@Override
public Integer visitIntegerValue(Parser.IntegerValueContext ctx) {
return Integer.valueOf(ctx.getText());
}
}
public class DoubleVisitor extends BaseListener<Double> {
@Override
public Double visitDoubleValue(Parser.DoubleValueContext ctx) {
return Integer.valueOf(ctx.getText());
}
}
当您访问截然不同的事物时,这更有意义(例如,如果您使用Java语法进行解析,则可能会有MethodVisitor
和ClassVisitor
等等。在此处查看示例:在此处查看示例
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句