1 cananian 1.1.2.15 // ExpList.java, created Thu Jan 14  0:54:59 1999 by cananian
  2 cananian 1.1.2.7  // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.7  // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 duncan   1.1.2.8  
  5 cananian 1.1.2.1  package harpoon.IR.Tree;
  6 cananian 1.1.2.1  
  7 cananian 1.1.2.17 import harpoon.Temp.TempMap;
  8 duncan   1.1.2.4  
  9 cananian 1.4      import net.cscott.jutil.UnmodifiableIterator;
 10 pnkfelix 1.1.2.13 
 11 duncan   1.1.2.6  import java.util.HashSet;
 12 duncan   1.1.2.6  import java.util.Iterator;
 13 duncan   1.1.2.9  import java.util.List; 
 14 duncan   1.1.2.9  import java.util.ListIterator; 
 15 duncan   1.1.2.6  import java.util.Set;
 16 duncan   1.1.2.2  
 17 cananian 1.1.2.1  /**
 18 cananian 1.1.2.1   * <code>ExpList</code>s form singly-linked lists of <code>Exp</code>s.
 19 cananian 1.1.2.1   * 
 20 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>, based on
 21 cananian 1.1.2.1   *          <i>Modern Compiler Implementation in Java</i> by Andrew Appel.
 22 cananian 1.4       * @version $Id: ExpList.java,v 1.4 2004/02/08 01:55:51 cananian Exp $
 23 cananian 1.1.2.1   */
 24 cananian 1.1.2.1  public final class ExpList {
 25 cananian 1.1.2.1      /** The expression at this list entry. */
 26 cananian 1.1.2.1      public final Exp head;
 27 cananian 1.1.2.1      /** The next list entry. */
 28 cananian 1.1.2.1      public final ExpList tail;
 29 cananian 1.1.2.1      /** List constructor. */
 30 cananian 1.1.2.1      public ExpList(Exp head, ExpList tail) { this.head=head; this.tail=tail; }
 31 duncan   1.1.2.10 
 32 duncan   1.1.2.10     public static ExpList toExpList(List list) { 
 33 duncan   1.1.2.9          ExpList THIS; 
 34 duncan   1.1.2.9  
 35 duncan   1.1.2.12         if (list.isEmpty()) {
 36 duncan   1.1.2.10             THIS = null; 
 37 duncan   1.1.2.9          }
 38 duncan   1.1.2.9          else { 
 39 duncan   1.1.2.12             THIS = null; 
 40 duncan   1.1.2.12             for (ListIterator i = list.listIterator(list.size()); 
 41 duncan   1.1.2.9                   i.hasPrevious();) { 
 42 duncan   1.1.2.11                 THIS = new ExpList((Exp)i.previous(), THIS); 
 43 duncan   1.1.2.9              }
 44 duncan   1.1.2.9          }
 45 duncan   1.1.2.10         return THIS; 
 46 pnkfelix 1.1.2.13     }
 47 pnkfelix 1.1.2.13 
 48 pnkfelix 1.1.2.13     /** FSK: didn't use standard JDK instance-local iterators because 
 49 pnkfelix 1.1.2.13         ExpLists are allowed to be null, and so such a definition
 50 pnkfelix 1.1.2.13         would encourage attempted method-calls on null.
 51 pnkfelix 1.1.2.13     */
 52 pnkfelix 1.1.2.13     public static Iterator iterator(final ExpList el) {
 53 pnkfelix 1.1.2.13         return new UnmodifiableIterator() {
 54 pnkfelix 1.1.2.13             ExpList curr = el;
 55 pnkfelix 1.1.2.13             public boolean hasNext() {
 56 pnkfelix 1.1.2.13                 return (curr != null);
 57 pnkfelix 1.1.2.13             }
 58 pnkfelix 1.1.2.13             public Object next() {
 59 pnkfelix 1.1.2.13                 Object o = curr.head;
 60 pnkfelix 1.1.2.13                 curr = curr.tail;
 61 pnkfelix 1.1.2.13                 return o;
 62 pnkfelix 1.1.2.13             }
 63 pnkfelix 1.1.2.13         };
 64 cananian 1.1.2.16     }
 65 cananian 1.1.2.16     public static int size(ExpList e) {
 66 cananian 1.1.2.16         int i=0;
 67 cananian 1.1.2.16         for (ExpList ep = e; ep!=null; ep=ep.tail)
 68 cananian 1.1.2.16             i++;
 69 cananian 1.1.2.16         return i;
 70 duncan   1.1.2.9      }
 71 duncan   1.1.2.8  
 72 duncan   1.1.2.8      public static ExpList replace(ExpList e, Exp eOld, Exp eNew) { 
 73 duncan   1.1.2.8          if (e==null) return null; 
 74 duncan   1.1.2.8          else
 75 duncan   1.1.2.8              return new ExpList
 76 duncan   1.1.2.8                  (e.head == eOld ? eNew : e.head, replace(e.tail, eOld, eNew));
 77 duncan   1.1.2.8      }
 78 duncan   1.1.2.2  
 79 cananian 1.1.2.17     public static ExpList rename(ExpList e, TreeFactory tf, TempMap tm,
 80 cananian 1.1.2.17                                  Tree.CloneCallback cb) {
 81 duncan   1.1.2.3          if (e==null) return null;
 82 duncan   1.1.2.3          else
 83 duncan   1.1.2.3              return new ExpList
 84 cananian 1.1.2.17               ((Exp)e.head.rename(tf, tm, cb),
 85 cananian 1.1.2.17                rename(e.tail, tf, tm, cb));
 86 duncan   1.1.2.4      }
 87 duncan   1.1.2.4      
 88 duncan   1.1.2.12     public String toString() { 
 89 duncan   1.1.2.12         StringBuffer sb = new StringBuffer(); 
 90 duncan   1.1.2.12         sb.append("EXPLIST<"); 
 91 duncan   1.1.2.14         sb.append(this.head == null ? "null" : 
 92 duncan   1.1.2.14                   this.head.toString() + ", "); 
 93 duncan   1.1.2.12         sb.append(this.tail == null ? "null" : this.tail.toString()); 
 94 duncan   1.1.2.12 
 95 duncan   1.1.2.12         return sb.toString(); 
 96 duncan   1.1.2.2      }
 97 cananian 1.1.2.1  }
 98 cananian 1.1.2.1  
 99 cananian 1.1.2.1  
100 cananian 1.2