在此代码中如何调用 val() 和 rep() 函数(它们没有定义)?



我正在使用一个名为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();
}

有一个类用于Integer表达式

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)})}

Nothing,它是一个抽象方法,因此没有任何实现。但你已经知道了。

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

相关内容

  • 没有找到相关文章

最新更新