私は単純な教育用の 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_VALUE
にCHAR_VALUE
見えますが、問題はクラスにあります。CUP は何らかの形でそれが組み込み型であるとBOOL_VALUE
認識せず、生成されたクラスは次のようになります。Boolean
SyntaxNode
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
を持たないため、これはコンパイルされません。setParent
SyntaxNode
私の質問は、何か間違ったことをしているのですか、それとも AST CUP 拡張機能のバグですか?