使用byaccj构建ast时出错

时间:2014-09-29 05:13:28

标签: java yacc parser-generator jflex

我正在使用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 个答案:

答案 0 :(得分:1)

你的program1声明说构造函数是:

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

需要classexpStringArrayList<field_decl>(如错误消息中的required:行所示)。您提供的是:

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

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