1

私は単純な教育用の Java に似た言語のコンパイラを作成しています。パーサーを生成するために cup_v10k.jar を使用しています。抽象構文ツリーを生成するために、AST CUP 拡張機能を使用しています。

私のparser.cupファイルには、他の終端記号とともに、

terminal Integer INT_VALUE;
terminal Character CHAR_VALUE;
terminal Boolean BOOL_VALUE;

非終端記号もありますConstant

の生産はConstant次のようになります。

Constant ::= INT_VALUE
             |
             CHAR_VALUE
             |
             BOOL_VALUE
             ;

CUP は、次のように parser_astbuild.cup ファイルにプロダクションを生成します。

Constant ::= INT_VALUE:I1 {: RESULT=new ConstantDerived1(I1); RESULT.setLine(I1left); :}
             |
             CHAR_VALUE:C1 {: RESULT=new ConstantDerived2(C1); RESULT.setLine(C1left); :}
             |
             BOOL_VALUE:B1 {: RESULT=new ConstantDerived3(B1); RESULT.setLine(B1left); :}
             ;

との生成されたクラスは問題ないようINT_VALUECHAR_VALUE見えますが、問題はクラスにあります。CUP は何らかの形でそれが組み込み型であるとBOOL_VALUE認識せず、生成されたクラスは次のようになります。BooleanSyntaxNode

public class ConstantDerived3 extends Constant {

    private Boolean B1;

    public ConstantDerived3 (Boolean B1) {
        this.B1=B1;
        if(B1!=null) B1.setParent(this);
    }

    public Boolean getB1() {
        return B1;
    }

    public void setB1(Boolean B1) {
        this.B1=B1;
    }

    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void childrenAccept(Visitor visitor) {
        if(B1!=null) B1.accept(visitor);
    }

    public void traverseTopDown(Visitor visitor) {
        accept(visitor);
        if(B1!=null) B1.traverseTopDown(visitor);
    }

    public void traverseBottomUp(Visitor visitor) {
        if(B1!=null) B1.traverseBottomUp(visitor);
        accept(visitor);
    }

    public String toString(String tab) {
        StringBuffer buffer=new StringBuffer();
        buffer.append(tab);
        buffer.append("ConstantDerived3(\n");

        if(B1!=null)
            buffer.append(B1.toString("  "+tab));
        else
            buffer.append(tab+"  null");
        buffer.append("\n");

        buffer.append(tab);
        buffer.append(") [ConstantDerived3]");
        return buffer.toString();
    }
}

Booleanは ではなく、および 他のメソッドSyntaxNodeを持たないため、これはコンパイルされません。setParentSyntaxNode

私の質問は、何か間違ったことをしているのですか、それとも AST CUP 拡張機能のバグですか?

4

1 に答える 1