diff options
Diffstat (limited to 'src/minijava/symboltable/MClasses.java')
-rw-r--r-- | src/minijava/symboltable/MClasses.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/minijava/symboltable/MClasses.java b/src/minijava/symboltable/MClasses.java index 2df2ba8..10bd009 100644 --- a/src/minijava/symboltable/MClasses.java +++ b/src/minijava/symboltable/MClasses.java @@ -5,9 +5,20 @@ package minijava.symboltable; import java.util.Vector; +import minijava.typecheck.PrintError; + public class MClasses extends MType { public Vector<MClass> mj_classes = new Vector<MClass>(); // 用于存放类 + MClass findClassByName(String c_name) { + for (int i=0; i<mj_classes.size(); i++) { + if (mj_classes.elementAt(i).getName().equals(c_name)) { + return mj_classes.elementAt(i); + } + } + return null; + } + // 在表中插入类 public String InsertClass(MClass v_class) { String class_name = v_class.getName(); @@ -28,6 +39,59 @@ public class MClasses extends MType { return false; } + public void buildClassRelation() { + // 通过extend_class_name确定extend_class, 并查找循环继承 + for (int i=0; i<mj_classes.size(); i++) { + MClass m_class = mj_classes.elementAt(i); + String ext_name = m_class.extend_class_name; + if (ext_name!=null) { + m_class.extend_class = findClassByName(ext_name); + } + } + int tag = 1; // 扫描循环继承的标记 + for (int i=0; i<mj_classes.size(); i++) { + MClass m_class = mj_classes.elementAt(i); + if (m_class.extend_tag==0) { + m_class.extend_tag = tag; + while (m_class.extend_class!=null) { + m_class = m_class.extend_class; + if (m_class.extend_tag==tag) { // 循环继承 + PrintError.print(m_class.line, m_class.column, + "Circular extend in class"+m_class.name); + break; // error + } else if (m_class.extend_tag==0) { + m_class.extend_tag = tag; + } else { + break; // no error + } + } + tag++; + } + } + } + + public boolean checkAllVars() { + boolean result = true; + for (int i=0; i<mj_classes.size(); i++) { + result &= mj_classes.elementAt(i).classVarCheck(); + } + return result; + } + + public boolean checkAllFuncs() { + boolean result = true; + for (int i=0; i<mj_classes.size(); i++) { + result &= mj_classes.elementAt(i).classFuncCheck(); + } + return result; + } + + public void checkAllStatements() { + for (int i=0; i<mj_classes.size(); i++) { + mj_classes.elementAt(i).classStatementCheck(); + } + } + // 调试输出: 打印所有的类的信息 public void printClasses(int spaces) { for (int i=0; i<mj_classes.size(); i++) { |