summaryrefslogtreecommitdiff
path: root/src/minijava/symboltable
diff options
context:
space:
mode:
Diffstat (limited to 'src/minijava/symboltable')
-rw-r--r--src/minijava/symboltable/MClass.java4
-rw-r--r--src/minijava/symboltable/MLocalVarType.java13
-rw-r--r--src/minijava/symboltable/MMethod.java18
3 files changed, 31 insertions, 4 deletions
diff --git a/src/minijava/symboltable/MClass.java b/src/minijava/symboltable/MClass.java
index a5b90f2..4e64f54 100644
--- a/src/minijava/symboltable/MClass.java
+++ b/src/minijava/symboltable/MClass.java
@@ -5,18 +5,16 @@ package minijava.symboltable;
import minijava.typecheck.PrintError;
-public class MClass extends MType {
+public class MClass extends MLocalVarType {
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();
}
diff --git a/src/minijava/symboltable/MLocalVarType.java b/src/minijava/symboltable/MLocalVarType.java
new file mode 100644
index 0000000..9824ae4
--- /dev/null
+++ b/src/minijava/symboltable/MLocalVarType.java
@@ -0,0 +1,13 @@
+/* 可定义局部变量的抽象类 */
+
+package minijava.symboltable;
+
+public abstract class MLocalVarType extends MType {
+ public MVarList vars;
+
+ public MLocalVarType(int m_line, int m_column) {
+ super(m_line, m_column);
+ vars = new MVarList();
+ }
+ public abstract String insertVar(MVariable var);
+}
diff --git a/src/minijava/symboltable/MMethod.java b/src/minijava/symboltable/MMethod.java
index 30159cf..f4b58fa 100644
--- a/src/minijava/symboltable/MMethod.java
+++ b/src/minijava/symboltable/MMethod.java
@@ -1,11 +1,27 @@
package minijava.symboltable;
-public class MMethod extends MType {
+public class MMethod extends MLocalVarType {
MVarList params;
String ret_type_name;
+ MClass method_class;
+ MVarList paramList;
public MMethod(String m_name, int m_type, int m_column) {
super(m_type, m_column);
this.name = m_name;
+ ret_type_name = null;
+ paramList = new MVarList();
+ }
+
+ public String insertVar(MVariable var) {
+ String var_name = var.getName();
+ if (paramList.findVar(var_name)!=-1) {
+ return "Variable \'" + var_name + "\' already in param list!";
+ }
+ if (vars.findVar(var_name)!=-1) {
+ return "Variable double declaration " + "\"" + var_name + "\"";
+ }
+ vars.insertVar(var);
+ return null;
}
}