00001 package edu.ksu.cis.bandera.prog;
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 import java.util.Vector;
00037 import edu.ksu.cis.bandera.util.*;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 public class CFGSkel
00048 {
00049
00050
00051
00052
00053 class node
00054 {
00055 boolean marked;
00056 Index index;
00057 Vector descendents;
00058
00059
00060
00061
00062
00063
00064 node(Index i)
00065 {
00066 index = i;
00067 marked = false;
00068 descendents = new Vector();
00069 }
00070
00071
00072
00073
00074
00075
00076 public boolean equals(Object o)
00077 {
00078 if (o instanceof node)
00079 return index.equals(((node) o).index);
00080 else if (o instanceof Index)
00081 return index.equals(o);
00082 else
00083 return false;
00084 }
00085
00086 public String toString()
00087 {
00088 if (marked)
00089 return index + ": * --> " + descendents;
00090 else
00091 return index + ": o --> " + descendents;
00092 }
00093 }
00094
00095
00096
00097
00098
00099 protected Vector skel;
00100
00101
00102
00103
00104
00105 public CFGSkel()
00106 {
00107 skel = new Vector();
00108 }
00109
00110
00111
00112
00113
00114 public void add(Index i)
00115 {
00116 skel.addElement(new node(i));
00117 }
00118
00119
00120
00121
00122
00123
00124 public void addDescendent(Index p, Index c)
00125 {
00126 int i;
00127 node n;
00128
00129 i = find(p);
00130 if (i < 0)
00131 {
00132 System.out.println("No index found: " + p);
00133 return;
00134 }
00135
00136 n =(node) skel.elementAt(i);
00137
00138 i = find(c);
00139
00140 if (i < 0)
00141 {
00142 add(c);
00143 n.descendents.addElement(new Integer(find(c)));
00144 }
00145 else
00146 {
00147 if (n.descendents.indexOf(new Integer(i)) < 0)
00148 n.descendents.addElement(new Integer(i));
00149 }
00150 }
00151
00152
00153
00154
00155
00156
00157
00158 int find(Index i)
00159 {
00160 return skel.indexOf(new node(i));
00161 }
00162
00163
00164
00165
00166
00167
00168 public void makeArc(Index p, Index c)
00169 {
00170 addDescendent(p, c);
00171 }
00172
00173
00174
00175
00176
00177
00178
00179 public void makeArc(Index p, Index c, boolean mark)
00180 {
00181 addDescendent(p, c);
00182 mark(c, mark);
00183 }
00184
00185
00186
00187
00188
00189 public void mark(Index i)
00190 {
00191 node n;
00192
00193 if (i == null)
00194 {
00195 System.out.println("Index is null.");
00196 return;
00197 }
00198 if (find(i) < 0)
00199 System.out.println("Index " + i + " not found.");
00200 else
00201 {
00202 n =(node) skel.elementAt(find(i));
00203 n.marked = true;
00204 }
00205 }
00206
00207
00208
00209
00210
00211
00212 public void mark(Index i, boolean m)
00213 {
00214 node n;
00215
00216 if (i == null)
00217 {
00218 System.out.println("Index is null.");
00219 return;
00220 }
00221 if (find(i) < 0)
00222 System.out.println("Index " + i + " not found.");
00223 else
00224 {
00225 n =(node) skel.elementAt(find(i));
00226 n.marked = m;
00227 }
00228 }
00229
00230
00231
00232
00233
00234 public Index next()
00235 {
00236 int i,
00237 j;
00238 Vector q = new Vector();
00239 Vector visit = new Vector();
00240 node n;
00241
00242 q.addElement(new Integer(0));
00243
00244 for(i = 0; i < q.size(); i++)
00245 {
00246 n =(node) skel.elementAt(((Integer) q.elementAt(i)).intValue());
00247 if (n.marked == false)
00248 return n.index;
00249 else if (!visit.contains(q.elementAt(i)))
00250 {
00251 visit.addElement(q.elementAt(i));
00252 for(j = 0; j < n.descendents.size(); j++)
00253 q.addElement(n.descendents.elementAt(j));
00254 }
00255 }
00256
00257 return null;
00258 }
00259
00260
00261
00262
00263
00264 public void start(Index i)
00265 {
00266 int ind = find(i);
00267
00268 if (ind == 0)
00269 unmark(i);
00270 else
00271 {
00272 skel.insertElementAt(new node(i), 0);
00273 }
00274 }
00275 public String toString()
00276 {
00277 int i;
00278 String s = "";
00279
00280 for(i = 0; i < skel.size(); i++)
00281 s += i + ": " + skel.elementAt(i) + "\n";
00282
00283 return s;
00284 }
00285
00286
00287
00288
00289
00290 public void unmark(Index i)
00291 {
00292 node n;
00293
00294 if (i == null)
00295 {
00296 System.out.println("Index is null.");
00297 return;
00298 }
00299 if (find(i) < 0)
00300 System.out.println("Index " + i + " not found.");
00301 else
00302 {
00303 n =(node) skel.elementAt(find(i));
00304 n.marked = false;
00305 }
00306 }
00307 }