summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2014-10-08 22:07:00 +0800
committerIru Cai <mytbk920423@gmail.com>2014-10-08 22:07:00 +0800
commit72b3d46d08190d672a0ac5eae3a2e1e022662a6b (patch)
tree5565ad79235a4a18851b5fac304282e7408b3867
parent748308e11e6791284b302f61e5bc0d99a0957b6a (diff)
downloadminijava-72b3d46d08190d672a0ac5eae3a2e1e022662a6b.tar.xz
Add check for method variables double declaration.
-rw-r--r--src/minijava/symboltable/MClass.java4
-rw-r--r--src/minijava/symboltable/MLocalVarType.java13
-rw-r--r--src/minijava/symboltable/MMethod.java18
-rw-r--r--src/minijava/visitor/BuildSymbolTableVisitor.java29
4 files changed, 50 insertions, 14 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;
}
}
diff --git a/src/minijava/visitor/BuildSymbolTableVisitor.java b/src/minijava/visitor/BuildSymbolTableVisitor.java
index d8d40f1..a3b6fe5 100644
--- a/src/minijava/visitor/BuildSymbolTableVisitor.java
+++ b/src/minijava/visitor/BuildSymbolTableVisitor.java
@@ -220,11 +220,11 @@ public class BuildSymbolTableVisitor extends GJDepthFirst<MType, MType> {
*/
public MType visit(VarDeclaration n, MType argu) {
MType _ret=null;
- MClass m_class = (MClass)argu;
+ MLocalVarType m_class = (MLocalVarType)argu; // m_class可能是类或方法
String var_name = n.f1.accept(this, argu).getName();
String type_name = n.f0.accept(this, argu).getName();
// debug
- System.out.println("Variable: \'" + var_name + "\' from class " + m_class.getName());
+ System.out.println("Variable: \'" + var_name + "\' from class/method " + m_class.getName());
System.out.println("It has type: " + type_name);
// 建立并插入变量
@@ -256,14 +256,23 @@ public class BuildSymbolTableVisitor extends GJDepthFirst<MType, MType> {
*/
public MType visit(MethodDeclaration n, MType argu) {
MType _ret = null;
- n.f0.accept(this, argu);
- n.f1.accept(this, argu);
- n.f2.accept(this, argu);
- n.f3.accept(this, argu);
- n.f4.accept(this, argu);
- n.f5.accept(this, argu);
- n.f6.accept(this, argu);
- n.f7.accept(this, argu);
+ MClass m_class = (MClass)argu;
+ String ret_type = n.f1.accept(this, argu).getName();
+ String method_name = n.f2.accept(this, argu).getName();
+ MMethod m_method = new MMethod(method_name, n.f2.f0.beginLine, n.f2.f0.beginColumn);
+
+ // 将定义的方法插入类中,如果出错则打印错误信息
+ String _err = m_class.insertMethod(m_method);
+ if (_err!=null) {
+ PrintError.print(n.f2.f0.beginLine, n.f2.f0.beginColumn, _err);
+ }
+
+ // 处理参数表
+ n.f4.accept(this, m_method);
+
+ // 函数局部变量处理
+ n.f7.accept(this, m_method);
+
n.f8.accept(this, argu);
n.f9.accept(this, argu);
n.f10.accept(this, argu);