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

轻而易举地

我使用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等等。在此处查看示例:在此处查看示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Keras:如何将fit_generator与不同类型的多个输出一起使用

Antlr4 Javascript访问者

ANTLR4访问者模式上的简单算术示例

antlr4的golang访问者模式是否处于可用状态?

Go中的AntLR4:无效的类型声明:侦听器

我可以将jQuery .trigger()与addEventListener()添加的事件侦听器一起使用吗?

我可以将SqlDependency与多个侦听器/负载平衡一起使用吗

RxSwift:将Zip与不同类型的可观察对象一起使用

如何设置和调用ANTLR4 Javascript访问者

使用访问者访问Antlr4中规则上下文的子上下文

递归使用Antlr4解析器和侦听器

Antlr4 C ++访问者API

无法使更改侦听器与滑块一起使用

在Antlr4输入侦听器中,访问器函数意外返回null

将useEffect与事件侦听器一起使用

JavaScript中的antlr4访问者中的自定义上下文变量

ANTLR4 JavaScript访问者中的ctx

使用ANTLR4解析树访问者的代码生成中的变化

将Kotlin协程与Spring Kafka侦听器一起使用

Antlr4侦听器子树检查条件

将OnItemLongClick侦听器与ListView一起使用

将Foreman与Rails 4和本地调试侦听器一起使用时,服务器没有响应

重构树控制器,可与许多不同类型一起使用

ANTLR 4中while循环的访问者/侦听器代码

如何在.Net中与不同类型的使用者一起使用RabbitMq消息?

在侦听器中使用ParserRuleContext遍历令牌-ANTLR4

Antlr4 基于事件的访问者 (javascript)

访问者变体并返回不同类型时出错

将 Laravel 事件/侦听器与 Nova 按钮一起使用