From 72b3d46d08190d672a0ac5eae3a2e1e022662a6b Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Wed, 8 Oct 2014 22:07:00 +0800 Subject: Add check for method variables double declaration. --- src/minijava/symboltable/MClass.java | 4 +--- src/minijava/symboltable/MLocalVarType.java | 13 ++++++++++ src/minijava/symboltable/MMethod.java | 18 +++++++++++++- src/minijava/visitor/BuildSymbolTableVisitor.java | 29 +++++++++++++++-------- 4 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/minijava/symboltable/MLocalVarType.java 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 { */ 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 { */ 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); -- cgit v1.2.3