有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用byaccj构建ast时出现java错误

我正在使用jflex和byaccj构建一个AST。 我无法解决该错误,我已使用类型转换,但错误仍然存在

对于语法中的以下规则:

program : CLASS Program '{' field_decl '}'      {
                program1 $$ = new program1($1.sval, $2.sval, $4.obj);
        }
        ;

我已经在我的.java文件中声明了这一点

abstract class program extends ASTnode{
}

class program1 extends program {
  private classexp ce = null;
  private String id="Program";
  private ArrayList<field_decl> fdecl = null;
  public program1(classexp ce,String id, ArrayList<field_decl> fdecl) {
    super();
    this.ce = ce;           
    this.id = id;
    this.fdecl = fdecl;
  }
}

错误是:

{program1 yyval= new program1(val_peek(4).sval,val_peek(3).sval,val_peek(1).obj);}
               ^
required: classexp,String,ArrayList<field_decl>
found: String,String,Object
reason: actual argument String cannot be converted to classexp by method invocation conversion
1 error

共 (1) 个答案

  1. # 1 楼答案

    您的program1声明表示构造函数是:

    public program1(classexp ce,String id, ArrayList<field_decl> fdecl)
    

    它接受一个classexp、一个String和一个ArrayList<field_decl>(如错误消息中的required:行所示)。您正在为其提供:

    new program1(val_peek(4).sval,val_peek(3).sval,val_peek(1).obj)
    

    也就是说,一个String,另一个String,和一个Object(如错误消息中的found:行所示)。为了使提供的参数适合所需参数,需要将第一个String转换为classexp,这是不可能的(如错误消息中的reason:行所示)。还需要将第三个参数Object转换为ArrayList<field_decl>,这可能也是不可能的,但构造函数中的一个错误足以拒绝调用