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