summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2014-10-09 21:27:22 +0800
committerIru Cai <mytbk920423@gmail.com>2014-10-09 21:27:22 +0800
commit0f1c5cf0bc56cbbc990d4f57ced59c518a5cc114 (patch)
tree82b10e0081811b3b9261c8344dde388ec6b876b9
parent07c5fd6cb477f7a561aad6128d93d4dab5d7e8cc (diff)
downloadminijava-0f1c5cf0bc56cbbc990d4f57ced59c518a5cc114.tar.xz
Update debugging support
-rw-r--r--src/minijava/symboltable/MClass.java17
-rw-r--r--src/minijava/symboltable/MClasses.java7
-rw-r--r--src/minijava/symboltable/MMethod.java15
-rw-r--r--src/minijava/symboltable/MMethodList.java4
-rw-r--r--src/minijava/symboltable/MVarList.java4
-rw-r--r--src/minijava/symboltable/MVariable.java5
-rw-r--r--src/minijava/symboltable/OutputFormat.java12
-rw-r--r--src/minijava/typecheck/Main.java9
-rw-r--r--src/minijava/visitor/BuildSymbolTableVisitor.java21
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);