diff options
Diffstat (limited to 'src/minijava/symboltable')
-rw-r--r-- | src/minijava/symboltable/MClass.java | 44 | ||||
-rw-r--r-- | src/minijava/symboltable/MClasses.java | 31 | ||||
-rw-r--r-- | src/minijava/symboltable/MIdentifier.java | 17 | ||||
-rw-r--r-- | src/minijava/symboltable/MMethod.java | 11 | ||||
-rw-r--r-- | src/minijava/symboltable/MMethodList.java | 24 | ||||
-rw-r--r-- | src/minijava/symboltable/MType.java | 43 | ||||
-rw-r--r-- | src/minijava/symboltable/MVarList.java | 24 | ||||
-rw-r--r-- | src/minijava/symboltable/MVariable.java | 11 |
8 files changed, 205 insertions, 0 deletions
diff --git a/src/minijava/symboltable/MClass.java b/src/minijava/symboltable/MClass.java new file mode 100644 index 0000000..a5b90f2 --- /dev/null +++ b/src/minijava/symboltable/MClass.java @@ -0,0 +1,44 @@ +/** + * 该类用于表示声明的类 + */ +package minijava.symboltable; + +import minijava.typecheck.PrintError; + +public class MClass extends MType { + public MClasses all_classes; // 所有类的列表 + public boolean isDeclared = false; // 是否已声明,用于检查符号表 + public String extend_class_name = null; // 所继承的类 + public MVarList vars; + public MMethodList methods; + + public MClass(String v_name, MClasses all, int m_line, int m_column) { + super(m_line, m_column); + name = v_name; + all_classes = all; + vars = new MVarList(); + methods = new MMethodList(); + } + + public String insertVar(MVariable var) { + String var_name = var.getName(); + if (vars.findVar(var_name)!=-1) { + return "Variable double declaration " + "\"" + var_name + "\""; + } + vars.insertVar(var); + return null; + } + + public String insertMethod(MMethod method) { + String method_name = method.getName(); + if (vars.findVar(method_name)!=-1) { + return "Method name \'" + method_name + "\' is the same of some variable."; + } + if (methods.findMethod(method_name)!=-1) { + return "Method double declaration " + "\"" + method_name + "\"."; + } + methods.addMethod(method); + return null; + } +} + diff --git a/src/minijava/symboltable/MClasses.java b/src/minijava/symboltable/MClasses.java new file mode 100644 index 0000000..a4d066f --- /dev/null +++ b/src/minijava/symboltable/MClasses.java @@ -0,0 +1,31 @@ +/** + * 所有声明的类的列表 + */ +package minijava.symboltable; + +import java.util.Vector; + +public class MClasses extends MType { + public Vector<MClass> mj_classes = new Vector<MClass>(); // 用于存放类 + + // 在表中插入类 + public String InsertClass(MClass v_class) { + String class_name = v_class.getName(); + if (Repeated(class_name)) // 如已经定义过该类,返回错误信息 + return "Class double declaration " + "\"" + class_name + "\""; + mj_classes.addElement(v_class); + return null; + } + + // 判定是否定义同名的类 + public boolean Repeated(String class_name) { + int sz = mj_classes.size(); + for (int i = 0; i < sz; i++) { + String c_name = ((MClass) mj_classes.elementAt(i)).getName(); + if (c_name.equals(class_name)) + return true; + } + return false; + } +} + diff --git a/src/minijava/symboltable/MIdentifier.java b/src/minijava/symboltable/MIdentifier.java new file mode 100644 index 0000000..45340ac --- /dev/null +++ b/src/minijava/symboltable/MIdentifier.java @@ -0,0 +1,17 @@ +/** + * 表示标识符的类,可用于表示变量 + */ +package minijava.symboltable; + +public class MIdentifier extends MType { + // 定义内置类型 + public static final String arrType = "int[]"; + public static final String intType = "int"; + public static final String boolType = "boolean"; + + public MIdentifier(String v_name, int v_line, int v_column) { + super(v_line, v_column); + name = v_name; + } +} + diff --git a/src/minijava/symboltable/MMethod.java b/src/minijava/symboltable/MMethod.java new file mode 100644 index 0000000..30159cf --- /dev/null +++ b/src/minijava/symboltable/MMethod.java @@ -0,0 +1,11 @@ +package minijava.symboltable; + +public class MMethod extends MType { + MVarList params; + String ret_type_name; + + public MMethod(String m_name, int m_type, int m_column) { + super(m_type, m_column); + this.name = m_name; + } +} diff --git a/src/minijava/symboltable/MMethodList.java b/src/minijava/symboltable/MMethodList.java new file mode 100644 index 0000000..34f79e6 --- /dev/null +++ b/src/minijava/symboltable/MMethodList.java @@ -0,0 +1,24 @@ +package minijava.symboltable; + +import java.util.Vector; + +public class MMethodList extends MType { + Vector<MMethod> methods; + + MMethodList() { + methods = new Vector<MMethod>(); + } + + public void addMethod(MMethod method) { + methods.addElement(method); + } + + public int findMethod(String m_name) { + for (int i=0; i<methods.size(); i++) { + if (methods.elementAt(i).name.equals(m_name)) { + return i; + } + } + return -1; + } +} diff --git a/src/minijava/symboltable/MType.java b/src/minijava/symboltable/MType.java new file mode 100644 index 0000000..07b11e7 --- /dev/null +++ b/src/minijava/symboltable/MType.java @@ -0,0 +1,43 @@ +/** + * 表示类型的类,symboltable包中所有类的父类 + */ +package minijava.symboltable; + +public abstract class MType { + protected String name; // 名称 + protected int line = 0; // 所在行 + protected int column = 0; // 所在列 + + public MType() { + }; + + public MType(int m_line, int m_column) { + line = m_line; + column = m_column; + } + + public String getName() { + return name; + } + + public int getLine() { + return line; + } + + public int getColumn() { + return column; + } + + public void setName(String v_name) { + name = v_name; + } + + public void setLine(int m_line) { + line = m_line; + } + + public void setColumn(int m_column) { + column = m_column; + } +} + diff --git a/src/minijava/symboltable/MVarList.java b/src/minijava/symboltable/MVarList.java new file mode 100644 index 0000000..ede97fc --- /dev/null +++ b/src/minijava/symboltable/MVarList.java @@ -0,0 +1,24 @@ +package minijava.symboltable; + +import java.util.Vector; + +public class MVarList extends MType { + /* a class for storing variables */ + Vector<MVariable> varlist; + public MVarList() { + varlist = new Vector<MVariable>(); + } + + public void insertVar(MVariable var) { + varlist.addElement(var); + } + + public int findVar(String v_name) { + for (int i=0; i<varlist.size(); i++) { + if (varlist.elementAt(i).name.equals(v_name)) { + return i; + } + } + return -1; + } +} diff --git a/src/minijava/symboltable/MVariable.java b/src/minijava/symboltable/MVariable.java new file mode 100644 index 0000000..2655561 --- /dev/null +++ b/src/minijava/symboltable/MVariable.java @@ -0,0 +1,11 @@ +package minijava.symboltable; + +public class MVariable extends MType { + String typename; + + public MVariable(String v_name, String v_type, int v_line, int v_column) { + super(v_line, v_column); + name = v_name; + typename = v_type; + } +} |