From 0f1c5cf0bc56cbbc990d4f57ced59c518a5cc114 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Thu, 9 Oct 2014 21:27:22 +0800 Subject: Update debugging support --- src/minijava/symboltable/MClass.java | 17 +++++++++++++++++ src/minijava/symboltable/MClasses.java | 7 +++++++ src/minijava/symboltable/MMethod.java | 15 ++++++++++++++- src/minijava/symboltable/MMethodList.java | 4 ++++ src/minijava/symboltable/MVarList.java | 4 ++++ src/minijava/symboltable/MVariable.java | 5 +++++ src/minijava/symboltable/OutputFormat.java | 12 ++++++++++++ src/minijava/typecheck/Main.java | 9 +++++++-- src/minijava/visitor/BuildSymbolTableVisitor.java | 21 +++++++++++---------- 9 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 src/minijava/symboltable/OutputFormat.java 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; i0) System.err.print(","); + paramList.varlist.elementAt(i).printVar(0); + } + System.err.println(")"); + for (int i=0; i0) { + 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 { 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 { 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); -- cgit v1.2.3