gpt4 book ai didi

java - 返回不同类型的对象时,将访问者或监听器与 ANTLR4 一起使用

转载 作者:行者123 更新时间:2023-12-01 13:05:17 26 4
gpt4 key购买 nike

我用 ANTLR4 将一种语言翻译成另一种语言。例如,当我阅读数字文字时,我可以返回 IntegerDouble .

@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 语法进行解析,您可能有 MethodVisitorClassVisitor 等。请参见此处的示例: See an example here

关于java - 返回不同类型的对象时,将访问者或监听器与 ANTLR4 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29599881/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com