changes
authorbdemsky <bdemsky>
Thu, 20 Apr 2006 20:34:52 +0000 (20:34 +0000)
committerbdemsky <bdemsky>
Thu, 20 Apr 2006 20:34:52 +0000 (20:34 +0000)
Robust/src/IR/State.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/FieldNode.java [deleted file]
Robust/src/IR/Tree/FlagNode.java [new file with mode: 0644]

index ee0d12bbf7f1c191fb593bc650095ff9b5422022..a811df0819de8cdc34ae82711a118cf5edf4a21d 100644 (file)
@@ -9,6 +9,7 @@ public class State {
 
     public State() {
        this.classes=new SymbolTable();
+       this.tasks=new SymbolTable();
        this.treemethodmap=new Hashtable();
        this.flatmethodmap=new Hashtable();
        this.parsetrees=new HashSet();
@@ -21,12 +22,14 @@ public class State {
     }
 
     public SymbolTable classes;
+    public SymbolTable tasks;
     public Set parsetrees;
     public Hashtable treemethodmap;
     public Hashtable flatmethodmap;
     private HashSet arraytypes;
     public Hashtable arraytonumber;
     private int numclasses=0;
+    private int numtasks=0;
     private int arraycount=0;
 
     public void addArrayType(TypeDescriptor td) {
@@ -92,4 +95,11 @@ public class State {
     public void addFlatCode(MethodDescriptor md, FlatMethod bn) {
        flatmethodmap.put(md,bn);
     }
+
+    public void addTask(TaskDescriptor td) {
+       if (tasks.contains(td.getSymbol()))
+           throw new Error("Task "+td.getSymbol()+" defined twice");
+       tasks.add(td);
+       numtasks++;
+    }
 }
index 6a22ef7a1657b128a24bf28fb2532619c8f8572c..44d793ec05332dda6243a6a96673b0ccca7761bc 100644 (file)
@@ -24,28 +24,63 @@ public class BuildIR {
                ParseNode type_pn=pnv.elementAt(i);
                if (isEmpty(type_pn)) /* Skip the semicolon */
                    continue;
-               ClassDescriptor cn=parseTypeDecl(type_pn);
-               state.addClass(cn);
+               if (isNode(type_pn,"class_declaration")) {
+                   ClassDescriptor cn=parseTypeDecl(type_pn);
+                   state.addClass(cn);
+               } else if (isNode(type_pn,"task_declaration")) {
+                   TaskDescriptor td=parseTaskDecl(type_pn);
+                   state.addTask(td);
+               } throw new Error();
            }
        }
     }
 
+    public TaskDescriptor parseTaskDecl(ParseNode pn) {
+       TaskDescriptor td=new TaskDescriptor(pn.getChild("name").getTerminal());
+       
+       ParseNode bodyn=pn.getChild("body");
+       BlockNode bn=parseBlock(bodyn);
+       parseParameterList(td, pn);
+       state.addTreeCode(td,bn);
+       return td;
+    }
+
+
+    public void parseParameterList(TaskDescriptor td, ParseNode pn) {
+       ParseNode paramlist=pn.getChild("task_parameter_list");
+       if (paramlist==null)
+           return;
+        ParseNodeVector pnv=paramlist.getChildren();
+        for(int i=0;i<pnv.size();i++) {
+            ParseNode paramn=pnv.elementAt(i);
+            TypeDescriptor type=parseTypeDescriptor(paramn);
+
+            ParseNode tmp=paramn;
+            while (tmp.getChild("single")==null) {
+                type=type.makeArray(state);
+                tmp=tmp.getChild("array");
+            }
+            String paramname=tmp.getChild("single").getTerminal();
+            
+            
+            td.addParameter(type,paramname);
+        }
+    }
+
     public ClassDescriptor parseTypeDecl(ParseNode pn) {
-       if (isNode(pn, "class_declaration")) {
-           ClassDescriptor cn=new ClassDescriptor(pn.getChild("name").getTerminal());
-           if (!isEmpty(pn.getChild("super").getTerminal())) {
-               /* parse superclass name */
-               ParseNode snn=pn.getChild("super").getChild("type").getChild("class").getChild("name");
-               NameDescriptor nd=parseName(snn);
-               cn.setSuper(nd.toString());
-           } else {
-               if (!cn.getSymbol().equals(TypeUtil.ObjectClass))
-                   cn.setSuper(TypeUtil.ObjectClass);
-           }
-           cn.setModifiers(parseModifiersList(pn.getChild("modifiers")));
-           parseClassBody(cn, pn.getChild("classbody"));
-           return cn;
-       } else throw new Error();
+       ClassDescriptor cn=new ClassDescriptor(pn.getChild("name").getTerminal());
+       if (!isEmpty(pn.getChild("super").getTerminal())) {
+           /* parse superclass name */
+           ParseNode snn=pn.getChild("super").getChild("type").getChild("class").getChild("name");
+           NameDescriptor nd=parseName(snn);
+           cn.setSuper(nd.toString());
+       } else {
+           if (!cn.getSymbol().equals(TypeUtil.ObjectClass))
+               cn.setSuper(TypeUtil.ObjectClass);
+       }
+       cn.setModifiers(parseModifiersList(pn.getChild("modifiers")));
+       parseClassBody(cn, pn.getChild("classbody"));
+       return cn;
     }
 
     private void parseClassBody(ClassDescriptor cn, ParseNode pn) {
diff --git a/Robust/src/IR/Tree/FieldNode.java b/Robust/src/IR/Tree/FieldNode.java
deleted file mode 100644 (file)
index 3ef4fa9..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-package IR.Tree;
-
-import IR.*;
-
-public class FlagNode extends FlagExpressionNode {
-    FlagDescriptor flag;
-    String name;
-
-    public FlagNode(String flag) {
-       this.name=flag;
-    }
-
-    public void setFlag(FlagDescriptor flag) {
-       this.flag=flag;
-    }
-
-    public FlagDescriptor getFlag() {
-       return flag;
-    }
-
-    public int kind() {
-       return Kind.FlagNode;
-    }
-
-    public String printNode(int indent) {
-       return name;
-    }
-}
diff --git a/Robust/src/IR/Tree/FlagNode.java b/Robust/src/IR/Tree/FlagNode.java
new file mode 100644 (file)
index 0000000..3ef4fa9
--- /dev/null
@@ -0,0 +1,28 @@
+package IR.Tree;
+
+import IR.*;
+
+public class FlagNode extends FlagExpressionNode {
+    FlagDescriptor flag;
+    String name;
+
+    public FlagNode(String flag) {
+       this.name=flag;
+    }
+
+    public void setFlag(FlagDescriptor flag) {
+       this.flag=flag;
+    }
+
+    public FlagDescriptor getFlag() {
+       return flag;
+    }
+
+    public int kind() {
+       return Kind.FlagNode;
+    }
+
+    public String printNode(int indent) {
+       return name;
+    }
+}