【问题标题】:error in building ast using byaccj使用 byaccj 构建 ast 时出错
【发布时间】:2014-09-29 05:13:27
【问题描述】:

我正在使用 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

【问题讨论】:

  • 请使用 Markdown 工具来格式化代码。要查看我做了什么,请编辑问题并查看。 (最重要的是:将代码 sn-ps 缩进 4 个空格。)我不确定我是否在正确位置的错误消息中得到了 ^,尽管没有插入符号,错误就足够清楚了。

标签: java yacc parser-generator jflex


【解决方案1】:

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

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

它采用classexpStringArrayList&lt;field_decl&gt;(如错误消息中的required: 行所示)。你提供给它:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多