Many changes
authorbdemsky <bdemsky>
Tue, 9 May 2006 00:47:43 +0000 (00:47 +0000)
committerbdemsky <bdemsky>
Tue, 9 May 2006 00:47:43 +0000 (00:47 +0000)
Robust/src/IR/TaskDescriptor.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/FlagEffects.java
Robust/src/IR/Tree/Kind.java

index 488783ceb33a850b44e3f8e8a878e1fb33917b94..c737dfa8e810acb85c0d58b6fee8af800f903c14 100644 (file)
@@ -1,6 +1,8 @@
 package IR;
-import IR.Tree.ExpressionNode;
+import IR.Tree.FlagExpressionNode;
+import IR.Tree.FlagEffects;
 import java.util.Vector;
+import java.util.Hashtable;
 
 /**
  * Descriptor 
@@ -13,17 +15,23 @@ public class TaskDescriptor extends Descriptor {
     protected Vector params;
     protected SymbolTable paramtable;
     protected VarDescriptor thisvd;
-
+    protected Hashtable flagstable;
+    protected FlagEffects fe;
 
     public TaskDescriptor(String identifier) {
        super(identifier);
        this.identifier=identifier;
        this.uniqueid=count++;
+       flagstable=new Hashtable();
        params=new Vector();
        paramtable=new SymbolTable();
        thisvd=null;
     }
 
+    public void addFlagEffects(FlagEffects fe) {
+       this.fe=fe;
+    }
+
     public String getSafeMethodDescriptor() {
        String st="";
        for(int i=0;i<numParameters();i++) {
@@ -38,12 +46,12 @@ public class TaskDescriptor extends Descriptor {
        return paramtable;
     }
 
-    public void addParameter(TypeDescriptor type, String paramname) {
+    public void addParameter(TypeDescriptor type, String paramname, FlagExpressionNode fen) {
        if (paramname.equals("this"))
            throw new Error("Can't have parameter named this");
        VarDescriptor vd=new VarDescriptor(type, paramname);
-
        params.add(vd);
+       flagstable.put(vd, fen);
        if (paramtable.getFromSameScope(paramname)!=null) {
            throw new Error("Parameter "+paramname+" already defined");
        }
index 2f2797fd93fa74d88bf81064e1acdf8e417cf187..b4fe2a6554d7e93ab5133e32ac265dfe3c6c1e90 100644 (file)
@@ -41,27 +41,33 @@ public class BuildIR {
        BlockNode bn=parseBlock(bodyn);
        parseParameterList(td, pn);
        state.addTreeCode(td,bn);
+       if (pn.getChild("flag_effects_list")!=null)
+           td.addFlagEffects(parseFlagEffects(pn.getChild("flag_effects_list")));
        return td;
     }
 
+    public FlagEffects parseFlagEffects(ParseNode pn) {
+       return null;
+    }
+
     public FlagExpressionNode parseFlagExpression(ParseNode pn) {
-       if (paramn.getChild("or")!=null) {
-           ParseNodeVector pnv=paramn.getChild("or").getChildren();
+       if (pn.getChild("or")!=null) {
+           ParseNodeVector pnv=pn.getChild("or").getChildren();
            ParseNode left=pnv.elementAt(0);
            ParseNode right=pnv.elementAt(1);
            return new FlagOpNode(parseFlagExpression(left), parseFlagExpression(right), new Operation(Operation.LOGIC_OR));
-       } else if (paramn.getChild("and")!=null) {
-           ParseNodeVector pnv=paramn.getChild("and").getChildren();
+       } else if (pn.getChild("and")!=null) {
+           ParseNodeVector pnv=pn.getChild("and").getChildren();
            ParseNode left=pnv.elementAt(0);
            ParseNode right=pnv.elementAt(1);
            return new FlagOpNode(parseFlagExpression(left), parseFlagExpression(right), new Operation(Operation.LOGIC_AND));
-       } else if (paramn.getChild("not")!=null) {
-           ParseNodeVector pnv=paramn.getChild("not").getChildren();
+       } else if (pn.getChild("not")!=null) {
+           ParseNodeVector pnv=pn.getChild("not").getChildren();
            ParseNode left=pnv.elementAt(0);
            return new FlagOpNode(parseFlagExpression(left), new Operation(Operation.LOGIC_NOT));           
 
-       } else if (paramn.getChild("name")!=null) {
-           return new FlagNode(paramn.getChild("name").getTerminal());
+       } else if (pn.getChild("name")!=null) {
+           return new FlagNode(pn.getChild("name").getTerminal());
        } else throw new Error();
     }
 
@@ -82,7 +88,7 @@ public class BuildIR {
             String paramname=tmp.getChild("single").getTerminal();
             FlagExpressionNode fen=parseFlagExpression(paramn.getChild("flag"));
             
-            td.addParameter(type,paramname);
+            td.addParameter(type,paramname,fen);
         }
     }
 
@@ -425,6 +431,11 @@ public class BuildIR {
            blockstatements.add(new IfStatementNode(parseExpression(pn.getChild("condition").getFirstChild()),
                                       parseSingleBlock(pn.getChild("statement").getFirstChild()),
                                       pn.getChild("else_statement")!=null?parseSingleBlock(pn.getChild("else_statement").getFirstChild()):null));
+       } else if (isNode(pn,"taskexit")) {
+           FlagEffects fe=null;
+           if (pn.getChild("flag_effects_list")!=null)
+               fe=parseFlagEffects(pn.getChild("flag_effects_list"));
+           blockstatements.add(new TaskExitNode(fe));
        } else if (isNode(pn,"return")) {
            if (isEmpty(pn.getTerminal()))
                blockstatements.add(new ReturnNode());
index de0f9bb7503801a58f2e25954edebfc6c4cc2fdf..bdc5ed02f7650875a0f454c106a48e373da8e591 100644 (file)
@@ -1,6 +1,7 @@
 package IR.Tree;
 
 import IR.*;
+import java.util.*;
 
 public class FlagEffects {
     Vector effects;
index 323fc42e20949e1bb327f003997c0e0a01417b3b..b74a5d7dc2585eafc9f8feeb4449ede47627dfae 100644 (file)
@@ -19,4 +19,5 @@ public class Kind {
     public final static int ArrayAccessNode=16;
     public final static int FlagNode=17;
     public final static int FlagOpNode=18;
+    public final static int TaskExitNode=19;
 }