diff options
Diffstat (limited to 'src/minijava/symboltable/MClass.java')
-rw-r--r-- | src/minijava/symboltable/MClass.java | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/minijava/symboltable/MClass.java b/src/minijava/symboltable/MClass.java index 37bfcfb..10354a8 100644 --- a/src/minijava/symboltable/MClass.java +++ b/src/minijava/symboltable/MClass.java @@ -6,9 +6,11 @@ package minijava.symboltable; import minijava.typecheck.PrintError; public class MClass extends MLocalVarType { - public MClasses all_classes; // 所有类的列表 + public MClasses all_classes; // 所有类的列表,在建立符号表时完成 public boolean isDeclared = false; // 是否已声明,用于检查符号表 - public String extend_class_name = null; // 所继承的类 + public String extend_class_name = null; // 所继承的类名 + public MClass extend_class = null; // 所继承的类,在符号表建立完成后才能求得 + public int extend_tag = 0; // 检测循环继承时用,0表示未检测 public MMethodList methods; public MClass(String v_name, MClasses all, int m_line, int m_column) { @@ -36,9 +38,50 @@ public class MClass extends MLocalVarType { return "Method double declaration " + "\"" + method_name + "\"."; } methods.addMethod(method); + method.method_class = this; return null; } + // 检测类型名是否有效 + public boolean validType(String s_type) { + if (s_type==MIdentifier.intType + || s_type==MIdentifier.boolType + || s_type==MIdentifier.arrType + || s_type==MIdentifier.voidType + || s_type==MIdentifier.sArrayType) { + return true; + } + + if (all_classes.findClassByName(s_type)!=null) { + return true; + } + + return false; + } + + // 对类进行类型检查 + public boolean classVarCheck() { + boolean result = true; + for (int i=0; i<methods.size(); i++) { + result &= methods.methods.elementAt(i).validVars(); + } + return result; + } + + public boolean classFuncCheck() { + boolean result = true; + for (int i=0; i<methods.size(); i++) { + result &= methods.methods.elementAt(i).validFunc(); + } + return result; + } + + public void classStatementCheck() { + for (int i=0; i<methods.size(); i++) { + methods.methods.elementAt(i).checkStatements(); + } + } + // 调试输出: 打印该类的信息 public void printClass(int spaces) { String ps = OutputFormat.spaces(spaces); |