【发布时间】:2018-01-09 00:31:22
【问题描述】:
我正在为一种简单的教育类 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 生成的类看起来不错,但问题在于BOOL_VALUE 类 - CUP 不知何故无法识别Boolean 是一个内置类型,并假定它是一个@ 987654330@。生成的类如下所示:
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 扩展中的错误?
【问题讨论】:
标签: java abstract-syntax-tree cup