📄 methoddescriptor.java
字号:
package CatDecaf.SymTable;
import java.util.*;
public class MethodDescriptor extends Descriptor{
//String name;
//int type;
boolean foundReturnStatement;
private int totalLocalSize, totalParamSize, maxCallInParamSize;
SymbolTable paramVar;
//SymbolTable localVar;
//boolean hasLocal;
public MethodDescriptor(String n, int t){
name = n; type = t; foundReturnStatement = false; maxCallInParamSize = 0;
}
public void setLocalSize(int i){
this.totalLocalSize = i;
}
public int getLocalSize(){
return this.totalLocalSize;
}
public void setParamSize(int i){
this.totalParamSize = i;
}
public int getParamSize(){
return this.totalParamSize;
}
public void setMaxCallInParamSize(int i){
this.maxCallInParamSize = i;
}
public int getMaxCallInParamSize(){
return this.maxCallInParamSize;
}
public void setParam(SymbolTable p){
paramVar = p;
if(this.name.equals("main")){
//System.out.println("Catched main");
if(!p.getDescriptorTable().isEmpty()){
System.err.println(parser.parser.infile+":" + parser.Scanner.lineno + ": 'main' method should have no parameters");
ClassProgram.numOfError++;
}
}
}
public SymbolTable getParam(){
return paramVar;
}
public String getMethodSignature(){
String s = SymbolTable.getTypeName(this.type) + " " + this.name + "(";
Iterator i = paramVar.getDescriptorTable().values().iterator();
while(i.hasNext()){
IDDescriptor idd = (IDDescriptor)i.next();
s += SymbolTable.getTypeName(idd.getType());
if(i.hasNext()) s += ",";
}
s += ")";
return s;
}
public boolean checkMethodType(int t){
this.foundReturnStatement = true;
boolean b = (t == this.type);
if(!b){
if(this.type == parser.sym.VOID)
System.err.println(parser.parser.infile+":" + parser.Scanner.lineno + ": cannot return a value from method whose result type is void; '" + this.getMethodSignature() + "'");
else
System.err.println(parser.parser.infile+":" + parser.Scanner.lineno + ": incompatible return types" + " for '" + this.getMethodSignature() + "'. Found: "
+ SymbolTable.getTypeName(t) + ", required: " + SymbolTable.getTypeName(this.type) );
ClassProgram.numOfError++;
}
return b;
}
public void setFoundReturnStatement(){
this.foundReturnStatement = true;
}
public boolean checkFoundReturnStatement(){
if(this.foundReturnStatement || (this.type == parser.sym.VOID)) return true;
System.err.println(parser.parser.infile+":" + parser.Scanner.lineno + ": missing return statement for '" + this.getMethodSignature() + "'");
ClassProgram.numOfError++;
return false;
}
public void pPrint(){
String stype;
if(type == parser.sym.INT) stype = "int";
else if(type == parser.sym.BOOLEAN) stype = "boolean";
else if(type == parser.sym.VOID) stype = "void";
else stype = "Error: unidentified type";
System.out.print("\n---------------------");
System.out.println("\nMethod " + stype + " " + name);
//System.out.println("Params:");
paramVar.pPrint();
System.out.println("\nParam size: " + this.totalParamSize + " Local size: " + this.totalLocalSize + " Max Callin Param size: " + this.maxCallInParamSize);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -