diff options
author | Iru Cai <mytbk920423@gmail.com> | 2014-10-09 21:27:22 +0800 |
---|---|---|
committer | Iru Cai <mytbk920423@gmail.com> | 2014-10-09 21:27:22 +0800 |
commit | 0f1c5cf0bc56cbbc990d4f57ced59c518a5cc114 (patch) | |
tree | 82b10e0081811b3b9261c8344dde388ec6b876b9 | |
parent | 07c5fd6cb477f7a561aad6128d93d4dab5d7e8cc (diff) | |
download | minijava-0f1c5cf0bc56cbbc990d4f57ced59c518a5cc114.tar.xz |
Update debugging support
-rw-r--r-- | src/minijava/symboltable/MClass.java | 17 | ||||
-rw-r--r-- | src/minijava/symboltable/MClasses.java | 7 | ||||
-rw-r--r-- | src/minijava/symboltable/MMethod.java | 15 | ||||
-rw-r--r-- | src/minijava/symboltable/MMethodList.java | 4 | ||||
-rw-r--r-- | src/minijava/symboltable/MVarList.java | 4 | ||||
-rw-r--r-- | src/minijava/symboltable/MVariable.java | 5 | ||||
-rw-r--r-- | src/minijava/symboltable/OutputFormat.java | 12 | ||||
-rw-r--r-- | src/minijava/typecheck/Main.java | 9 | ||||
-rw-r--r-- | src/minijava/visitor/BuildSymbolTableVisitor.java | 21 |
9 files changed, 81 insertions, 13 deletions
diff --git a/src/minijava/symboltable/MClass.java b/src/minijava/symboltable/MClass.java index 4e64f54..37bfcfb 100644 --- a/src/minijava/symboltable/MClass.java +++ b/src/minijava/symboltable/MClass.java @@ -38,5 +38,22 @@ public class MClass extends MLocalVarType { methods.addMethod(method); return null; } + + // 调试输出: 打印该类的信息 + public void printClass(int spaces) { + String ps = OutputFormat.spaces(spaces); + if (this.extend_class_name!=null) { + System.err.println(ps + "Class "+this.name+" extends "+this.extend_class_name); + } else { + System.err.println(ps + "Class "+this.name); + } + for (int i=0; i<vars.size(); i++) { + vars.varlist.elementAt(i).printVar(spaces+2); + System.err.println(); + } + for (int i=0; i<methods.size(); i++) { + methods.methods.elementAt(i).printMethod(spaces+2); + } + } } diff --git a/src/minijava/symboltable/MClasses.java b/src/minijava/symboltable/MClasses.java index a4d066f..2df2ba8 100644 --- a/src/minijava/symboltable/MClasses.java +++ b/src/minijava/symboltable/MClasses.java @@ -27,5 +27,12 @@ public class MClasses extends MType { } return false; } + + // 调试输出: 打印所有的类的信息 + public void printClasses(int spaces) { + for (int i=0; i<mj_classes.size(); i++) { + mj_classes.elementAt(i).printClass(spaces); + } + } } diff --git a/src/minijava/symboltable/MMethod.java b/src/minijava/symboltable/MMethod.java index ea2a363..3b0888e 100644 --- a/src/minijava/symboltable/MMethod.java +++ b/src/minijava/symboltable/MMethod.java @@ -10,7 +10,6 @@ public class MMethod extends MLocalVarType { super(m_line, m_column); this.name = m_name; this.ret_type_name = ret_type; - ret_type_name = null; paramList = new MVarList(); } @@ -34,4 +33,18 @@ public class MMethod extends MLocalVarType { paramList.insertVar(var); return null; } + + public void printMethod(int spaces) { + String ps = OutputFormat.spaces(spaces); + System.err.print(ps + this.ret_type_name + " " + this.name + "("); + for (int i=0; i<paramList.size(); i++) { + if (i>0) System.err.print(","); + paramList.varlist.elementAt(i).printVar(0); + } + System.err.println(")"); + for (int i=0; i<vars.size(); i++) { + vars.varlist.elementAt(i).printVar(spaces+2); + System.err.println(); + } + } } diff --git a/src/minijava/symboltable/MMethodList.java b/src/minijava/symboltable/MMethodList.java index 34f79e6..01bef3c 100644 --- a/src/minijava/symboltable/MMethodList.java +++ b/src/minijava/symboltable/MMethodList.java @@ -21,4 +21,8 @@ public class MMethodList extends MType { } return -1; } + + public int size() { + return methods.size(); + } } diff --git a/src/minijava/symboltable/MVarList.java b/src/minijava/symboltable/MVarList.java index ede97fc..79f7457 100644 --- a/src/minijava/symboltable/MVarList.java +++ b/src/minijava/symboltable/MVarList.java @@ -21,4 +21,8 @@ public class MVarList extends MType { } return -1; } + + public int size() { + return varlist.size(); + } } diff --git a/src/minijava/symboltable/MVariable.java b/src/minijava/symboltable/MVariable.java index 2655561..4501396 100644 --- a/src/minijava/symboltable/MVariable.java +++ b/src/minijava/symboltable/MVariable.java @@ -8,4 +8,9 @@ public class MVariable extends MType { name = v_name; typename = v_type; } + + public void printVar(int spaces) { + String ps = OutputFormat.spaces(spaces); + System.err.print(ps + typename + " " + this.name); + } } diff --git a/src/minijava/symboltable/OutputFormat.java b/src/minijava/symboltable/OutputFormat.java new file mode 100644 index 0000000..71a819e --- /dev/null +++ b/src/minijava/symboltable/OutputFormat.java @@ -0,0 +1,12 @@ +package minijava.symboltable; + +public class OutputFormat { + public static String spaces(int n) { + String s = ""; + while (n>0) { + s+=" "; + n--; + } + return s; + } +} diff --git a/src/minijava/typecheck/Main.java b/src/minijava/typecheck/Main.java index 35ac860..7319fe4 100644 --- a/src/minijava/typecheck/Main.java +++ b/src/minijava/typecheck/Main.java @@ -20,11 +20,16 @@ public class Main { Node root = MiniJavaParser.Goal(); // 初始化符号表中最大的类 - MType my_classes = new MClasses(); + MClasses my_classes = new MClasses(); // 遍历抽象语法树,建立符号表,检查是否重复定义 root.accept(new BuildSymbolTableVisitor(), my_classes); - + + // 输出符号表信息 + if (args.length>0 && args[0].equals("--debug")){ + my_classes.printClasses(0); + } + // 打印错误信息 PrintError.printAll(); } catch (TokenMgrError e) { diff --git a/src/minijava/visitor/BuildSymbolTableVisitor.java b/src/minijava/visitor/BuildSymbolTableVisitor.java index ecc1a06..1a09957 100644 --- a/src/minijava/visitor/BuildSymbolTableVisitor.java +++ b/src/minijava/visitor/BuildSymbolTableVisitor.java @@ -114,14 +114,15 @@ public class BuildSymbolTableVisitor extends GJDepthFirst<MType, MType> { 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); - n.f8.accept(this, argu); - n.f9.accept(this, argu); - n.f10.accept(this, argu); - // main的参数,待处理 - n.f11.accept(this, argu); + + // 往main class中添加main方法 + MMethod main_method = new MMethod("main", "void", n.f6.beginLine, n.f6.beginColumn); + MIdentifier argid = (MIdentifier) n.f11.accept(this, argu); + MVariable param = new MVariable(argid.getName(), "String[]", + argid.getLine(), argid.getColumn()); + main_method.addParam(param); + m_class.insertMethod(main_method); + n.f12.accept(this, argu); n.f13.accept(this, argu); // printStatement @@ -224,8 +225,8 @@ public class BuildSymbolTableVisitor extends GJDepthFirst<MType, MType> { 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/method " + m_class.getName()); - System.out.println("It has type: " + type_name); + // System.out.println("Variable: \'" + var_name + "\' from class/method " + m_class.getName()); + // System.out.println("It has type: " + type_name); // 建立并插入变量 MVariable var = new MVariable(var_name, type_name, n.f1.f0.beginLine, n.f1.f0.beginColumn); |