extends the location hierarchy definition grammar.
authoryeom <yeom>
Wed, 27 Apr 2011 21:30:06 +0000 (21:30 +0000)
committeryeom <yeom>
Wed, 27 Apr 2011 21:30:06 +0000 (21:30 +0000)
while working on annotating ssjava class library, realize the need to have a way to keep only one location(with top and bottom) in the local hierarchy.

Robust/src/IR/Tree/BuildIR.java
Robust/src/Parse/java14.cup
Robust/src/Util/Lattice.java

index 91370d913721969e8a32e23d6eec1c409692cc5e..6aca57d499f65a76aeb52686f821cc551f40f146 100644 (file)
@@ -638,12 +638,17 @@ public class BuildIR {
         String spinLoc=loc.getChildren().elementAt(0).getLabel();
         spinLocSet.add(spinLoc);
       } else {
-        String lowerLoc=loc.getChildren().elementAt(0).getLabel();
-        String higherLoc= loc.getChildren().elementAt(1).getLabel();
-        locOrder.put(higherLoc, lowerLoc);
-        if (locOrder.isIntroducingCycle(higherLoc)) {
-          throw new Error("Error: the order relation " + lowerLoc + " < " + higherLoc
-                          + " introduces a cycle.");
+        if(loc.getChildren().size()==1){
+          String locIentifier=loc.getChildren().elementAt(0).getLabel();
+          locOrder.put(locIentifier);
+        }else{
+          String lowerLoc=loc.getChildren().elementAt(0).getLabel();
+          String higherLoc= loc.getChildren().elementAt(1).getLabel();
+          locOrder.put(higherLoc, lowerLoc);
+          if (locOrder.isIntroducingCycle(higherLoc)) {
+            throw new Error("Error: the order relation " + lowerLoc + " < " + higherLoc
+                + " introduces a cycle.");
+          }
         }
       }
     }
index ab4a13f7ad940bf41ec102d688284d6b4c460c57..d37ae7f495abf6bea5666e01e07a4d465bcba57f 100644 (file)
@@ -1322,6 +1322,11 @@ location_order ::=
                pn.addChild(loc);
                RESULT=pn;
        :}
+       |       IDENTIFIER:loc {:
+               ParseNode pn=new ParseNode("location_order",parser.lexer.line_num);
+               pn.addChild(loc);
+               RESULT=pn;
+       :}
         ;
 
 // 19.9) Interfaces
index de9c98b31fdb26e43b7ed15693da7152ea76bcfd..cb8da73fd19687cde10da4571d40b556fa89cbf0 100644 (file)
@@ -34,6 +34,20 @@ public class Lattice<T> {
     return table.keySet();
   }
 
+  public boolean put(T key) {
+    if (table.containsKey(key)) {
+      return false;
+    } else {
+      // new key, need to be connected with top/bottom
+      size++;
+      table.get(top).add(key);
+      Set<T> neightborSet = new HashSet<T>();
+      neightborSet.add(bottom);
+      table.put(key, neightborSet);
+      return true;
+    }
+  }
+
   public boolean put(T key, T value) {
     Set<T> s;
 
@@ -84,7 +98,7 @@ public class Lattice<T> {
     do {
       oldReachableSize = reachableSet.size();
       Set<T> nextLevelNeighbors = new HashSet<T>();
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
         T element = iterator.next();
         Set<T> neighbors = get(element);
         if (neighbors != null) {
@@ -137,7 +151,7 @@ public class Lattice<T> {
       return true;
     } else {
       boolean reachable = false;
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
         T neighbor = iterator.next();
         reachable = reachable || isGreaterThan(neighbor, b);
       }
@@ -150,7 +164,7 @@ public class Lattice<T> {
     Set<T> lowerSet = new HashSet<T>();
 
     // get lower set of input locations
-    for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext(); ) {
+    for (Iterator<T> iterator = inputSet.iterator(); iterator.hasNext();) {
       T element = iterator.next();
       lowerSet.addAll(getLowerSet(element, new HashSet<T>()));
       lowerSet.add(element);
@@ -158,10 +172,10 @@ public class Lattice<T> {
 
     // an element of lower bound should be lower than every input set
     Set<T> toberemoved = new HashSet<T>();
-    for (Iterator<T> inputIterator = inputSet.iterator(); inputIterator.hasNext(); ) {
+    for (Iterator<T> inputIterator = inputSet.iterator(); inputIterator.hasNext();) {
       T inputElement = inputIterator.next();
 
-      for (Iterator iterator = lowerSet.iterator(); iterator.hasNext(); ) {
+      for (Iterator iterator = lowerSet.iterator(); iterator.hasNext();) {
         T lowerElement = (T) iterator.next();
         if (!inputElement.equals(lowerElement)) {
           if (!isGreaterThan(inputElement, lowerElement)) {
@@ -174,10 +188,10 @@ public class Lattice<T> {
 
     // calculate the greatest element of lower set
     // find an element A, where every lower bound B of lowerSet, B<A
-    for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext(); ) {
+    for (Iterator<T> iterator = lowerSet.iterator(); iterator.hasNext();) {
       T lowerElement = iterator.next();
       boolean isGreaterThanAll = true;
-      for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext(); ) {
+      for (Iterator<T> iterator2 = lowerSet.iterator(); iterator2.hasNext();) {
         T e = iterator2.next();
         if (!lowerElement.equals(e)) {
           if (!isGreaterThan(lowerElement, e)) {
@@ -198,7 +212,7 @@ public class Lattice<T> {
     Set<T> neighborSet = get(element);
     if (neighborSet != null) {
       lowerSet.addAll(neighborSet);
-      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext(); ) {
+      for (Iterator<T> iterator = neighborSet.iterator(); iterator.hasNext();) {
         T neighbor = iterator.next();
         lowerSet = getLowerSet(neighbor, lowerSet);
       }