1

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

4

1 に答える 1

0

何もありません。これは抽象メソッドであるため、実装はありません。しかし、あなたはすでにそれを知っていました。

Exprを呼び出しているときのインスタンスはなく、 のサブクラスになり、paraExpr.rep().egを実装するものになります。paraExpExprrep()IntExpr

于 2015-11-19T16:21:59.983 に答える