【问题标题】:how can you pass an object to a function as a parameter, then have the function to assign a new object of a subtype to its parameter?如何将对象作为参数传递给函数,然后让函数将子类型的新对象分配给它的参数?
【发布时间】:2021-07-03 10:32:18
【问题描述】:

我正在尝试使用递归下降解析方法和访问者模式构建一个编译器,以便使用 Java 进行语义检查。让我困惑的是使用访问者模式,我们必须创建不同的子类型。但是,Java 不会通过引用传递。这导致我无法为每个语义记录找到正确的子类型。这是我要实现的目标

Node node = new ExprNode();
changeNodeType(node);

public void changeNodeType(Node node) {
     node = new AddOpNode();
}

那么最终我的节点类型将以 AddOpNode() 结束。有什么方法可以最终在 Java 中实现吗?

【问题讨论】:

  • 您可以返回新对象并将其分配给适当位置的节点
  • 我不清楚你为什么认为你需要这个changeNodeType。您的措辞表明您可能认为使用访问者模式需要这种方法。事实并非如此。
  • 在一个不相关的注释上:当您为不同的表达式类型使用子类时,创建ExprNode 对我来说似乎很奇怪。在这样的类型层次结构中,我希望 ExprNode 是抽象的。

标签: java compiler-construction visitor-pattern


【解决方案1】:

您可以只返回新的节点类型并将其分配到函数之外。

Node node = new ExprNode();
node = changeNodeType();

public Node changeNodeType() {
     return new AddOpNode();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 2015-11-22
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    相关资源
    最近更新 更多