1 20 21 package JFlex; 22 23 import java.util.*; 24 25 26 31 public class CharClasses { 32 33 34 private static final boolean DEBUG = false; 35 36 37 public static final char maxChar = '\uFFFF'; 38 39 40 private Vector classes; 41 42 43 private char maxCharUsed; 44 45 56 public CharClasses(int maxCharCode) { 57 if (maxCharCode < 0 || maxCharCode > 0xFFFF) 58 throw new IllegalArgumentException (); 59 60 maxCharUsed = (char) maxCharCode; 61 62 classes = new Vector(); 63 classes.addElement(new IntCharSet(new Interval((char) 0, maxChar))); 64 } 65 66 67 70 public char getMaxCharCode() { 71 return maxCharUsed; 72 } 73 74 75 81 public void setMaxCharCode(int charCode) { 82 if (charCode < 0 || charCode > 0xFFFF) 83 throw new IllegalArgumentException (); 84 85 maxCharUsed = (char) charCode; 86 } 87 88 89 92 public int getNumClasses() { 93 return classes.size(); 94 } 95 96 97 98 108 public void makeClass(IntCharSet set, boolean caseless) { 109 if (caseless) set = set.getCaseless(); 110 111 if ( DEBUG ) { 112 Out.dump("makeClass("+set+")"); 113 dump(); 114 } 115 116 int oldSize = classes.size(); 117 for (int i = 0; i < oldSize; i++) { 118 IntCharSet x = (IntCharSet) classes.elementAt(i); 119 120 if (x.equals(set)) return; 121 122 IntCharSet and = x.and(set); 123 124 if ( and.containsElements() ) { 125 if ( x.equals(and) ) { 126 set.sub(and); 127 continue; 128 } 129 else if ( set.equals(and) ) { 130 x.sub(and); 131 classes.addElement(and); 132 if (DEBUG) { 133 Out.dump("makeClass(..) finished"); 134 dump(); 135 } 136 return; 137 } 138 139 set.sub(and); 140 x.sub(and); 141 classes.addElement(and); 142 } 143 } 144 145 if (DEBUG) { 146 Out.dump("makeClass(..) finished"); 147 dump(); 148 } 149 } 150 151 152 155 public int getClassCode(char letter) { 156 int i = -1; 157 while (true) { 158 IntCharSet x = (IntCharSet) classes.elementAt(++i); 159 if ( x.contains(letter) ) return i; 160 } 161 } 162 163 166 public void dump() { 167 Out.dump(toString()); 168 } 169 170 171 176 public String toString(int theClass) { 177 return classes.elementAt(theClass).toString(); 178 } 179 180 181 187 public String toString() { 188 StringBuffer result = new StringBuffer ("CharClasses:"); 189 190 result.append(Out.NL); 191 192 for (int i = 0; i < classes.size(); i++) 193 result.append("class "+i+":"+Out.NL+classes.elementAt(i)+Out.NL); 194 195 return result.toString(); 196 } 197 198 199 204 public void makeClass(char singleChar, boolean caseless) { 205 makeClass(new IntCharSet(singleChar), caseless); 206 } 207 208 209 214 public void makeClass(String str, boolean caseless) { 215 for (int i = 0; i < str.length(); i++) makeClass(str.charAt(i), caseless); 216 } 217 218 219 232 public void makeClass(Vector v, boolean caseless) { 233 makeClass(new IntCharSet(v), caseless); 234 } 235 236 237 252 public void makeClassNot(Vector v, boolean caseless) { 253 makeClass(new IntCharSet(v), caseless); 254 } 255 256 257 261 private int [] getClassCodes(IntCharSet set, boolean negate) { 262 263 if (DEBUG) { 264 Out.dump("getting class codes for "+set); 265 if (negate) 266 Out.dump("[negated]"); 267 } 268 269 int size = classes.size(); 270 271 int temp [] = new int [size]; 273 int length = 0; 274 275 for (int i = 0; i < size; i++) { 276 IntCharSet x = (IntCharSet) classes.elementAt(i); 277 if ( negate ) { 278 if ( !set.and(x).containsElements() ) { 279 temp[length++] = i; 280 if (DEBUG) Out.dump("code "+i); 281 } 282 } 283 else { 284 if ( set.and(x).containsElements() ) { 285 temp[length++] = i; 286 if (DEBUG) Out.dump("code "+i); 287 } 288 } 289 } 290 291 int result [] = new int [length]; 292 System.arraycopy(temp, 0, result, 0, length); 293 294 return result; 295 } 296 297 298 307 public int [] getClassCodes(Vector intervallVec) { 308 return getClassCodes(new IntCharSet(intervallVec), false); 309 } 310 311 312 321 public int [] getNotClassCodes(Vector intervallVec) { 322 return getClassCodes(new IntCharSet(intervallVec), true); 323 } 324 325 326 332 public void check() { 333 for (int i = 0; i < classes.size(); i++) 334 for (int j = i+1; j < classes.size(); j++) { 335 IntCharSet x = (IntCharSet) classes.elementAt(i); 336 IntCharSet y = (IntCharSet) classes.elementAt(j); 337 if ( x.and(y).containsElements() ) { 338 System.out.println("Error: non disjoint char classes "+i+" and "+j); 339 System.out.println("class "+i+": "+x); 340 System.out.println("class "+j+": "+y); 341 } 342 } 343 344 for (char c = 0; c < maxChar; c++) { 347 getClassCode(c); 348 if (c % 100 == 0) System.out.print("."); 349 } 350 351 getClassCode(maxChar); 352 } 353 354 355 365 public CharClassInterval [] getIntervalls() { 366 int i, c; 367 int size = classes.size(); 368 int numIntervalls = 0; 369 370 for (i = 0; i < size; i++) 371 numIntervalls+= ((IntCharSet) classes.elementAt(i)).numIntervalls(); 372 373 CharClassInterval [] result = new CharClassInterval[numIntervalls]; 374 375 i = 0; 376 c = 0; 377 while (i < numIntervalls) { 378 int code = getClassCode((char) c); 379 IntCharSet set = (IntCharSet) classes.elementAt(code); 380 Interval iv = set.getNext(); 381 382 result[i++] = new CharClassInterval(iv.start, iv.end, code); 383 c = iv.end+1; 384 } 385 386 return result; 387 } 388 } 389 | Popular Tags |