Bug fixes
authorbdemsky <bdemsky>
Thu, 16 Feb 2006 09:14:29 +0000 (09:14 +0000)
committerbdemsky <bdemsky>
Thu, 16 Feb 2006 09:14:29 +0000 (09:14 +0000)
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/ReturnNode.java
Robust/src/IR/Tree/BlockExpressionNode.java
Robust/src/IR/Tree/DeclarationNode.java
Robust/src/IR/Tree/IfStatementNode.java
Robust/src/IR/Tree/LoopNode.java
Robust/src/IR/Tree/ReturnNode.java
Robust/src/IR/Tree/SubBlockNode.java

index 8946b7f9f3d1960009cd7aaf311a7efc79cb740d..257be353e2901b8a8d06f7ef4caf10e5746690f8 100644 (file)
@@ -48,34 +48,81 @@ public class BuildFlat {
        return new NodePair(begin,end);
     }
 
-    private NodePair flattenExpressionNode(ExpressionNode en) {
+    private NodePair flattenBlockExpressionNode(BlockExpressionNode en) {
+       throw new Error();
+    }
 
+    private NodePair flattenExpressionNode(ExpressionNode en) {
+       throw new Error();
     }
 
     private NodePair flattenDeclarationNode(DeclarationNode dn) {
-
+       throw new Error();
     }
         
     private NodePair flattenIfStatementNode(IfStatementNode isn) {
-
+       throw new Error();
     }
            
     private NodePair flattenLoopNode(LoopNode ln) {
+       if (ln.getType()==LoopNode.FORLOOP) {
+           NodePair initializer=flattenBlockNode(ln.getInitializer());
+           TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+           NodePair condition=flattenExpressionNode(ln.getCondition());
+           NodePair update=flattenBlockNode(ln.getUpdate());
+           NodePair body=flattenBlockNode(ln.getBody());
+           FlatNode begin=initializer.getBegin();
+           FlatCondBranch fcb=new FlatCondBranch(cond_temp);
+           FlatNop nopend=new FlatNop();
 
+           initializer.getEnd().addNext(condition.getBegin());
+           body.getEnd().addNext(update.getBegin());
+           update.getEnd().addNext(condition.getBegin());
+           condition.getEnd().addNext(fcb);
+           fcb.addFalseNext(nopend);
+           fcb.addTrueNext(body.getBegin());
+           return new NodePair(begin,nopend);
+       } else if (ln.getType()==LoopNode.WHILELOOP) {
+           TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+           NodePair condition=flattenExpressionNode(ln.getCondition());
+           NodePair body=flattenBlockNode(ln.getBody());
+           FlatNode begin=condition.getBegin();
+           FlatCondBranch fcb=new FlatCondBranch(cond_temp);
+           FlatNop nopend=new FlatNop();
+
+           body.getEnd().addNext(condition.getBegin());
+           condition.getEnd().addNext(fcb);
+           fcb.addFalseNext(nopend);
+           fcb.addTrueNext(body.getBegin());
+           return new NodePair(begin,nopend);
+       } else if (ln.getType()==LoopNode.DOWHILELOOP) {
+           TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+           NodePair condition=flattenExpressionNode(ln.getCondition());
+           NodePair body=flattenBlockNode(ln.getBody());
+           FlatNode begin=body.getBegin();
+           FlatCondBranch fcb=new FlatCondBranch(cond_temp);
+           FlatNop nopend=new FlatNop();
+
+           body.getEnd().addNext(condition.getBegin());
+           condition.getEnd().addNext(fcb);
+           fcb.addFalseNext(nopend);
+           fcb.addTrueNext(body.getBegin());
+           return new NodePair(begin,nopend);
+       } else throw new Error();
     }
            
-    private NodePair flattenReturnNode(ReturnNode rn) {
-
+    private NodePair flattenReturnNode(IR.Tree.ReturnNode rntree) {
+       throw new Error();
     }
            
     private NodePair flattenSubBlockNode(SubBlockNode sbn) {
-
+       return flattenBlockNode(sbn.getBlockNode());
     }
 
     private NodePair flattenBlockStatementNode(BlockStatementNode bsn) {
        switch(bsn.kind()) {
        case Kind.BlockExpressionNode:
-           return flattenExpressionNode((ExpressionNode)bsn);
+           return flattenBlockExpressionNode((BlockExpressionNode)bsn);
            
        case Kind.DeclarationNode:
            return flattenDeclarationNode((DeclarationNode)bsn);
@@ -87,7 +134,7 @@ public class BuildFlat {
            return flattenLoopNode((LoopNode)bsn);
            
        case Kind.ReturnNode:
-           return flattenReturnNode((ReturnNode)bsn);
+           return flattenReturnNode((IR.Tree.ReturnNode)bsn);
            
        case Kind.SubBlockNode:
            return flattenSubBlockNode((SubBlockNode)bsn);
index 4ee9adbbd35b7e3a29bf938346a1a65c093e0d8f..ba11f7618bd2f982dbc0e646bc45545bee8ac4b3 100644 (file)
@@ -1,8 +1,14 @@
+package IR.Flat;
+
 public class ReturnNode extends FlatNode {
-    public ReturnNode() {
-    }
+    TempDescriptor tempdesc;
 
-    
+    public ReturnNode(TempDescriptor td) {
+       this.tempdesc=td;
+    }
 
+    public String toString() {
+       return "return "+tempdesc;
+    }
 
 }
index 9cfd9d29d54734bd71a3ad91ef5cbb9f510f46bb..751e134d3e6525ca538c02786453ff6b5a528483 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Tree;
 
-class BlockExpressionNode extends BlockStatementNode {
+public class BlockExpressionNode extends BlockStatementNode {
     ExpressionNode en;
     public BlockExpressionNode(ExpressionNode e) {
        this.en=e;
index ec0933234cfffd30f967559e5ac6d57ba5857aaa..d8825f3aac799cec536dcfee44eece580ad7a133 100644 (file)
@@ -1,7 +1,7 @@
 package IR.Tree;
 import IR.VarDescriptor;
 
-class DeclarationNode extends BlockStatementNode {
+public class DeclarationNode extends BlockStatementNode {
     VarDescriptor vd;
     public DeclarationNode(VarDescriptor var) {
        vd=var;
index 2077409b712db5cd8317639c12de7d8db4c751c1..419f0de34f18bedf3d558d10238e9e3ad62c66f0 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Tree;
 
-class IfStatementNode extends BlockStatementNode {
+public class IfStatementNode extends BlockStatementNode {
     ExpressionNode cond;
     BlockNode true_st;
     BlockNode else_st;
index f387d6c0fdca624e32b04b4eae7d9abc7a8ff96c..d604b1aae6565093e1a34079ece10499ebd46aba 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Tree;
 
-class LoopNode extends BlockStatementNode {
+public class LoopNode extends BlockStatementNode {
     BlockNode initializer;
     ExpressionNode condition;
     BlockNode update;
@@ -26,6 +26,22 @@ class LoopNode extends BlockStatementNode {
        this.type=type;
     }
     
+    public BlockNode getInitializer() {
+       return initializer;
+    }
+
+    public ExpressionNode getCondition() {
+       return condition;
+    }
+
+    public BlockNode getUpdate() {
+       return update;
+    }
+
+    public BlockNode getBody() {
+       return body;
+    }
+
     public String printNode(int indent) {
        if (type==FORLOOP) {
            return "for("+initializer.printNode(0)+";"+condition.printNode(0)+
@@ -38,6 +54,10 @@ class LoopNode extends BlockStatementNode {
        } else throw new Error();
     }
 
+    public int getType() {
+       return type;
+    }
+
     public int kind() {
        return Kind.LoopNode;
     }
index aef5a0d3de79c9e1785a2df5baa7f7007fd70217..27dfd32f4c7eafdb322c6b1ab5a746a06fe4d2b3 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Tree;
 
-class ReturnNode extends BlockStatementNode {
+public class ReturnNode extends BlockStatementNode {
     ExpressionNode en;
 
     public ReturnNode() {
index f2ff9358f28555d8428b0958fb4c389263615e4a..8ab42ef4b4b67646ae72a99e479f2be464266c50 100644 (file)
@@ -1,6 +1,6 @@
 package IR.Tree;
 
-class SubBlockNode extends BlockStatementNode {
+public class SubBlockNode extends BlockStatementNode {
     BlockNode bn;
     public SubBlockNode(BlockNode bn) {
        this.bn=bn;
@@ -9,6 +9,11 @@ class SubBlockNode extends BlockStatementNode {
     public String printNode(int indent) {
        return bn.printNode(indent);
     }
+
+    public BlockNode getBlockNode() {
+       return bn;
+    }
+
     public int kind() {
        return Kind.SubBlockNode;
     }