From 6f42d803d875427bb705c0deddd10a9f8a13eb93 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Fri, 24 Oct 2014 20:42:47 +0800 Subject: Begin miniJava to Piglet --- src/minijava/minijava2piglet/Main.java | 23 ++++++++++++++++++----- src/minijava/minijava2piglet/PigletLabel.java | 9 +++++++++ src/minijava/minijava2piglet/PigletTemp.java | 9 +++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 src/minijava/minijava2piglet/PigletLabel.java create mode 100644 src/minijava/minijava2piglet/PigletTemp.java diff --git a/src/minijava/minijava2piglet/Main.java b/src/minijava/minijava2piglet/Main.java index 02e5e22..9e8607a 100644 --- a/src/minijava/minijava2piglet/Main.java +++ b/src/minijava/minijava2piglet/Main.java @@ -3,23 +3,36 @@ package minijava.minijava2piglet; import minijava.MiniJavaParser; import minijava.ParseException; import minijava.TokenMgrError; +import minijava.symboltable.MClasses; import minijava.syntaxtree.Node; +import minijava.typecheck.PrintError; +import minijava.visitor.BuildSymbolTableVisitor; import minijava.visitor.GJDepthFirst; +import minijava.visitor.GenPigletVisitor; public class Main { public static void main(String[] args) { try { - Node root = new MiniJavaParser(System.in).Goal(); + new MiniJavaParser(System.in); + Node root = MiniJavaParser.Goal(); + + // 初始化符号表中最大的类 + MClasses my_classes = new MClasses(); + + // 遍历抽象语法树,建立符号表,检查是否重复定义 + root.accept(new BuildSymbolTableVisitor(), my_classes); + + // 建立类的继承关系,寻找循环继承 + my_classes.buildClassRelation(); + /* * TODO: Implement your own Visitors and other classes. * */ - GJDepthFirst v = new GJDepthFirst() { - }; - //Traverse the Abstract Grammar Tree - root.accept(v,null); + GJDepthFirst v = new GenPigletVisitor(); + root.accept(v, my_classes); } catch(TokenMgrError e){ //Handle Lexical Errors diff --git a/src/minijava/minijava2piglet/PigletLabel.java b/src/minijava/minijava2piglet/PigletLabel.java new file mode 100644 index 0000000..b4cf917 --- /dev/null +++ b/src/minijava/minijava2piglet/PigletLabel.java @@ -0,0 +1,9 @@ +package minijava.minijava2piglet; + +public class PigletLabel { + static int nLabels = 0; + public static String newLabel() { + nLabels++; + return "L"+nLabels; + } +} diff --git a/src/minijava/minijava2piglet/PigletTemp.java b/src/minijava/minijava2piglet/PigletTemp.java new file mode 100644 index 0000000..282f148 --- /dev/null +++ b/src/minijava/minijava2piglet/PigletTemp.java @@ -0,0 +1,9 @@ +package minijava.minijava2piglet; + +public class PigletTemp { + static int tmpid = 20; + public static String newTmp() { + tmpid++; + return "TEMP "+tmpid; + } +} -- cgit v1.2.3