这段代码中如何调用 val() 和 rep() 函数(它们没有定义)?
How is it that the val() and rep() functions are called in this code(there's no definition for them)?
我正在使用一个名为 CUP 的解析器生成器。我获得了 class 定义的语法(CUP 规范)和这段支持代码 (Expr.java)。
在 CUP 规范中,语法产生式具有与它们关联的语义操作,如下所示:
expr ::= expr:e1 PLUS expr:e2
{: RESULT = new OpExpr(e1,e2,sym.PLUS); :};
class 的定义是这样的:
package java_cup.output;
abstract class Expr {
protected static String symbols[] = new String[12];
.
.
.
public abstract Integer val();
public abstract String rep();
}
有一个 class 用于整数表达式
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 个像:
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 class 的 rep() 函数没有给出定义(因为它是抽象的)。那么这个函数调用是做什么的呢? paraExpr.rep()
当我创建项目、构建解析器并解析输入字符串时,它会创建一个 AST 并像这样打印出来:
ParaExpr{(IntExpr{(1)}+IntExpr{(2)})}
没什么,它是一个抽象方法,因此没有任何实现。但你已经知道了。
当您调用 paraExpr.rep()
时,您不会有 Expr
的实例,paraExp
将是 Expr
的子类, 实施 rep()
.e.g. IntExpr
我正在使用一个名为 CUP 的解析器生成器。我获得了 class 定义的语法(CUP 规范)和这段支持代码 (Expr.java)。
在 CUP 规范中,语法产生式具有与它们关联的语义操作,如下所示:
expr ::= expr:e1 PLUS expr:e2
{: RESULT = new OpExpr(e1,e2,sym.PLUS); :};
class 的定义是这样的:
package java_cup.output;
abstract class Expr {
protected static String symbols[] = new String[12];
.
.
.
public abstract Integer val();
public abstract String rep();
}
有一个 class 用于整数表达式
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 个像:
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 class 的 rep() 函数没有给出定义(因为它是抽象的)。那么这个函数调用是做什么的呢? paraExpr.rep()
当我创建项目、构建解析器并解析输入字符串时,它会创建一个 AST 并像这样打印出来:
ParaExpr{(IntExpr{(1)}+IntExpr{(2)})}
没什么,它是一个抽象方法,因此没有任何实现。但你已经知道了。
当您调用 paraExpr.rep()
时,您不会有 Expr
的实例,paraExp
将是 Expr
的子类, 实施 rep()
.e.g. IntExpr