【问题标题】:cup_v10k AST does not recognize Booleancup_v10k AST 无法识别布尔值
【发布时间】: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_VALUECHAR_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


    【解决方案1】:

    这是 AST CUP 扩展中的一个错误。扩展程序正在运行此代码以检查类型是基本类型还是SyntaxNode

    public static boolean isBasicType(String stack_type) {
        if (stack_type.equals("Object")) {
            return true;
        } else if (stack_type.equals("String")) {
            return true;
        } else if (stack_type.equals("Integer")) {
            return true;
        } else if (stack_type.equals("Character")) {
            return true;
        } else if (stack_type.equals("int")) {
            return true;
        } else {
            return stack_type.equals("char");
        }
    }
    

    这不识别Boolean,然后假设BooleanSyntaxNode类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 2022-10-19
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多