【问题标题】:How is it that the val() and rep() functions are called in this code(there's no definition for them)?这段代码中如何调用 val() 和 rep() 函数(它们没有定义)?
【发布时间】:2015-11-19 16:01:07
【问题描述】:

我正在使用一个名为 CUP 的解析器生成器。我获得了类定义的语法(CUP 规范)和这段支持代码(Expr.java)。

在 CUP 规范中,语法产生式具有与其相关的语义动作,如下所示:

expr ::= expr:e1 PLUS expr:e2
{: RESULT = new OpExpr(e1,e2,sym.PLUS); :};

类定义是这样的:

package java_cup.output;
abstract class Expr {

    protected static String symbols[] = new String[12];

    .
    .
    .

    public abstract Integer val();

    public abstract String rep();

}

整数表达式有一个类

class IntExpr extends Expr{

    Integer intExpr;

    public IntExpr(Integer e) { intExpr = e; }

    public Integer val() { return intExpr; }

    public String rep() { return "Integer{"+intExpr.toString()+"}"; }

}

然后,有如下类:

class ParaExpr extends Expr {

    Expr paraExpr;

    public ParaExpr(Expr e) { paraExpr = e; }

    public Integer val() { return paraExpr.val(); }

    public String rep() { return "ParaExpr{("+paraExpr.rep()+")}"; }

}

基本上,我的问题是:没有为 Expr 类的 rep() 函数给出定义(因为它是抽象的)。那么这个函数调用是做什么的呢? paraExpr.rep()

当我创建项目、构建解析器并解析输入字符串时,它会创建一个 AST 并将其打印出来,如下所示:

ParaExpr{(IntExpr{(1)}+IntExpr{(2)})}

【问题讨论】:

    标签: abstract-syntax-tree compiler-construction cup


    【解决方案1】:

    没什么,它是一个抽象方法,所以没有任何实现。但你已经知道了。

    当您调用paraExpr.rep() 时,您不会有Expr 的实例,paraExp 将是Expr 的子类,确实 实现了rep()。例如。 IntExpr

    【讨论】:

    • 那么,你是说 paraExpr(它扩展了 Expr,它是抽象的)在那里寻找函数的定义,但没有找到任何函数定义的兄弟类?
    • 差不多。 IntExpr 是 Expr 的子类。 paraExpr 是一个变量,它指向一个至少是 Expr 但可以是子类的对象。当您在对象上调用方法时,它从子类(在本例中为 IntExpr)开始,并在类层次结构中向上工作,直到找到实现。在这里,因为 IntExpr 实现了 rep(),所以它不需要查看其他任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多