summaryrefslogtreecommitdiff
path: root/src/minijava/symboltable
diff options
context:
space:
mode:
Diffstat (limited to 'src/minijava/symboltable')
-rw-r--r--src/minijava/symboltable/MClass.java44
-rw-r--r--src/minijava/symboltable/MClasses.java31
-rw-r--r--src/minijava/symboltable/MIdentifier.java17
-rw-r--r--src/minijava/symboltable/MMethod.java11
-rw-r--r--src/minijava/symboltable/MMethodList.java24
-rw-r--r--src/minijava/symboltable/MType.java43
-rw-r--r--src/minijava/symboltable/MVarList.java24
-rw-r--r--src/minijava/symboltable/MVariable.java11
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;
+ }
+}