package minijava.symboltable; import java.util.HashMap; import java.util.Map; import minijava.minijava2piglet.PigletBinding; import minijava.minijava2piglet.PigletTemp; import minijava.typecheck.PrintError; public class MMethod extends MLocalVarType { MVarList params; public String ret_type_name; public MClass method_class; public MVarList paramList; public MStatementList statements; public MExpression ret_expr; public HashMap varBinding; public MMethod(String m_name, String ret_type, int m_line, int m_column) { super(m_line, m_column); this.name = m_name; this.ret_type_name = ret_type; paramList = new MVarList(); statements = new MStatementList(); } public String insertVar(MVariable var) { String var_name = var.getName(); if (paramList.findVar(var_name)!=-1) { return "Variable \'" + var_name + "\' already in param list!"; } if (vars.findVar(var_name)!=-1) { return "Variable double declaration " + "\"" + var_name + "\""; } vars.insertVar(var); return null; } public String addParam(MVariable var) { String var_name = var.getName(); if (paramList.findVar(var_name)!=-1) { return "Parameter variable double declaration: " + var_name; } paramList.insertVar(var); return null; } // 检测函数的返回类型,参数类型,局部变量类型是否为有效类型 public boolean validVars() { if (method_class.validType(ret_type_name)==false) { PrintError.print(this.line, this.column, "Return type of method "+this.name+" invalid"); return false; } for (int i=0; i(); for (int i=0; i=20 parameters, the last parameter should be a pointer to // the rest parameters int restidx = i-18; String tmp = PigletTemp.newTmp(); PigletBinding ret = new PigletBinding(null, null); ret.read = "\nBEGIN\nHLOAD " + tmp + " TEMP 19 " + restidx*4 + "\nRETURN " + tmp + "\nEND"; ret.write = "TEMP 19 " + restidx*4; return ret; } } } // not in paramList either, check for the class return method_class.getVarBinding(id); } public void checkStatements() { statements.checkStatements(this); // 检查返回类型是否和返回值匹配 if (ret_type_name==MIdentifier.voidType && ret_expr==null) { // ok } else if (!ret_type_name.equals(ret_expr.exprType(this))) { MClasses all = this.method_class.all_classes; MClass t1 = all.findClassByName(ret_type_name); MClass t2 = all.findClassByName(ret_expr.exprType(this)); if (t1!=null) { while (t2!=null && t2!=t1) { t2 = t2.extend_class; } } if (t1!=t2) { PrintError.print(line, column, "return expression and return type mismatch!"); } } } public void printMethod(int spaces) { String ps = OutputFormat.spaces(spaces); System.err.print(ps + this.ret_type_name + " " + this.name + "("); // 输出形式参数 for (int i=0; i0) System.err.print(","); paramList.varlist.elementAt(i).printVar(0); } System.err.println(")"); // 输出局部变量 for (int i=0; i