1 package com.daffodilwoods.daffodildb.utils.parser; 2 3 import java.util.ArrayList ; 4 import java.util.HashMap ; 5 6 import java.lang.reflect.*; 7 import com.daffodilwoods.daffodildb.server.sql99.token._TOKEN; 8 import com.daffodilwoods.database.resource.*; 9 import com.daffodilwoods.database.utility.P; 10 import com.daffodilwoods.daffodildb.utils.DBStack; 11 import java.util.Iterator ; 12 import java.util.Map ; 13 14 25 26 public abstract class ProductionRules implements java.io.Serializable ,ProductionRuleParserConstants, Comparable { 27 28 32 public Object []rules; 33 Object []updatedRules; 34 35 39 public String nameOfRule; 40 41 44 String ruleKey; 45 46 51 52 56 Class classMaker; 57 58 61 String className; 62 63 67 static char[] delimitedTokens = new char[]{'(',',',' ',')','[',']',';','\n','\t','.','\'','"',13}; 68 69 70 73 Object result; 74 75 79 boolean recursiveflag = false; 80 81 84 85 86 90 ProductionRules tokenRule; 91 92 96 String []fieldNames; 97 Object []fields; 98 99 102 HashMap hashMap; 103 104 boolean angularType = false; 105 boolean repUnion = false; 106 boolean toMakeClass = true; 107 ClassLoader classLoader; 108 109 TokenGenerator TG=ProductionRuleParser.tk; 110 111 void setRepUnionType(boolean b){ 112 repUnion = true; 113 } 114 115 ProductionRules(ClassLoader classLoader0){ 116 classLoader = classLoader0; 117 } 118 119 125 126 public void setProductionRules(ArrayList productionRules){ 127 rules = productionRules.toArray(); 128 updatedRules = rules; 129 if (( this instanceof StringProductionRules ) && productionRules.size() == 1 ){ 130 fieldNames = new String [1]; 131 fieldNames[0] = new StringBuffer ("_").append((String )productionRules.get(0)).append("0").toString(); 132 return; 133 } 134 if( nameOfRule != null ){ 135 int size = rules == null ? 0 : rules.length; 136 fieldNames = new String [size]; 137 for(int i = size - 1 ; i >= 0 ; i--){ 138 String name = null; 139 if ( size == 1 && toMakeClass && !repUnion){ 140 name=new StringBuffer ("_").append(nameOfRule).append("0").toString(); 141 } 142 else{ 143 ProductionRules rule = (ProductionRules)rules[i]; 144 if(rule instanceof StringProductionRules){ 145 name = new StringBuffer ("_").append(((StringProductionRules)rule).keyWord).append(i).toString(); 146 } 147 else{ 148 name = new StringBuffer ("_").append(repUnion ? rule.ruleKey : rule.getProductionRuleName()).append(i).toString(); 149 } 150 } 151 fieldNames[i] = updateNameOfRule(name); 152 } 153 } 154 } 155 156 159 160 public void setProductionRuleName(String nameOfRule1){ 161 this.nameOfRule = nameOfRule1; 162 int size = rules == null ? 0 : rules.length; 163 fieldNames = new String [size]; 164 for(int i = size - 1 ; i >= 0 ; i--){ 165 String name = null; 166 if (size == 1 && toMakeClass && !repUnion){ 167 StringBuffer str=new StringBuffer ("_"); 168 name = str.append(nameOfRule).append("0").toString(); 169 } 170 else{ 171 ProductionRules rule = (ProductionRules)rules[i]; 172 if ( rule instanceof StringProductionRules ){ 173 StringBuffer str=new StringBuffer ("_"); 174 name = str.append(( (StringProductionRules) rule).keyWord).append(i).toString(); 175 } 176 else{ 177 StringBuffer str=new StringBuffer ("_"); 178 name = str.append(repUnion ? rule.ruleKey : rule.getProductionRuleName()).append(i).toString(); 179 } 180 } 181 fieldNames[i] = updateNameOfRule(name); 182 } 183 className = initailizeNameOfClass(nameOfRule); 184 } 185 186 191 192 String initailizeNameOfClass(String nameRule){ 193 return updateNameOfRule(nameRule); 194 } 195 196 199 200 String getProductionRuleName(){ 201 return nameOfRule; 202 } 203 204 207 208 209 219 220 221 244 271 private Object parse(String query,int position,char []queryArray,ParseElements pe) throws DException{ 272 pe.successfulRule.clear(); 273 pe.position = position; 274 pe.hashMap = hashMap; 275 276 Object object = parse(pe); 277 return new Object []{object,new Integer (pe.position)}; 278 } 279 280 public static void traverseSuccessFulMap(ParseElements pe){ 281 Iterator it=pe.successfulRule.entrySet().iterator(); 282 Map.Entry me; 283 while(it.hasNext()){ 284 me =(Map.Entry )it.next(); 285 } 286 } 287 288 289 290 303 public Object parseUsingTokens(String query) throws DException { 304 if(query == null) 305 throw new DException("DSE8007",null); query = query.trim(); 307 ParseElements pe = new ParseElements(); 308 pe.successfulRule = new HashMap (); 309 pe.tokenFlag = false; 310 pe.bestOptionFlag = true; 311 pe.hashMap = hashMap; 312 pe.position = 0; 313 pe.query = query; 314 pe.parseException.setQuery(query); 315 pe.queryArray = query.toCharArray(); 316 317 Object o[] =getTokensOfQuery(query,pe.queryArray,new ParseElements()); 318 319 320 321 pe.tokens = (Object [])o[0]; 322 pe.parseException.position = -1; 323 pe.index = (Object [])o[1]; 324 325 326 327 pe.queryTokenCharacterArray = makeCharacterArray(pe.tokens); 328 329 Object object = parse(pe); 330 331 if ( pe.position < pe.tokens.length ){ 332 com.daffodilwoods.daffodildb.server.serversystem.PrintHandler.print("NOT PARSED [" + query+"]"); 333 pe.parseException.setQuery(query); 334 int position = pe.parseException.causeOfFailurePosition; 335 336 pe.parseException.causeOfFailure = ""; 337 if(pe.tokens[position] instanceof com.daffodilwoods.daffodildb.server.sql99.token.SRESERVEDWORD1206543922) 338 pe.parseException.causeOfFailure = "the keyword "; 339 340 pe.parseException.causeOfFailure += pe.tokens[position]; 341 throw pe.parseException; 342 } 343 return object; 344 } 345 346 public Object parseBatchUsingTokens(String query) throws DException { 347 if(query == null) 348 throw new DException("DSE8007",null); 349 query = query.trim(); 350 ArrayList list = new ArrayList (); 351 ParseElements pe = new ParseElements(); 352 pe.successfulRule = new HashMap (); 353 pe.tokenFlag = false; 354 pe.bestOptionFlag = true; 355 pe.hashMap = hashMap; 356 pe.position = 0; 357 pe.query = query; 358 pe.queryArray = query.toCharArray(); 359 360 Object o[] = getTokensOfQuery(query,pe.queryArray,new ParseElements()); 361 pe.parseException.position = -1; 362 pe.tokens = (Object [])o[0]; 363 pe.index = (Object [])o[1]; 364 365 366 367 pe.queryTokenCharacterArray = makeCharacterArray(pe.tokens); 368 Object object = parse(pe); 369 checkingForPosition(object,pe,list); 370 return list.toArray(); 371 } 372 373 private void checkingForPosition(Object object,ParseElements pe,ArrayList list)throws DException{ 374 if ( pe.position < pe.tokens.length ){ 375 if (object instanceof ParseException){ 376 int position = pe.parseException.causeOfFailurePosition; 377 pe.parseException.causeOfFailure = ""; 378 if(pe.tokens[position] instanceof com.daffodilwoods.daffodildb.server.sql99.token.SRESERVEDWORD1206543922) 379 pe.parseException.causeOfFailure = "the keyword "; 380 pe.parseException.causeOfFailure += pe.tokens[position]; 381 throw pe.parseException; 382 } 383 else{ 384 list.add(object); 385 checkingForPosition(parse(pe),pe,list); 386 } 387 }else list.add(object); 388 } 389 390 391 private char[][] makeCharacterArray(Object []arrayOfTokens) throws DException { 392 char [][]array = new char[arrayOfTokens.length][]; 393 for(int i = 0; i < array.length; ++i){ 394 if ( ((_TOKEN)arrayOfTokens[i]).getType() == 1 || ((_TOKEN)arrayOfTokens[i]).getType() == 2 ){ 395 String s = arrayOfTokens[i].toString().trim().toUpperCase(); 396 StringBuffer s1 =new StringBuffer ("S"); 397 s1.append(s).append(s.hashCode()); 398 array[i] = updateNameOfRule(s1.toString()).toCharArray(); 399 }else{ 400 String name= arrayOfTokens[i].getClass().getName(); 401 name = ((DaffodilClassLoader)classLoader).getQualifiedName(name); 402 array[i] = name.substring(name.lastIndexOf(".")+1).toCharArray(); 403 } 404 } 405 return array; 406 } 407 408 409 425 432 433 abstract Object parsePart(ParseElements pe) throws DException; 434 435 443 444 Object parse(ParseElements pe) throws DException{ 445 int position = pe.position; 446 447 Object object = parsePart(pe); 448 if(object instanceof ParseException){ 449 pe.position = position; 450 return object; 451 } 452 return object; 453 } 454 455 464 private Object [] getTokensOfQuery(String query,char []queryArray,ParseElements parseElements) throws DException{ 465 466 ArrayList listOfTokens = new ArrayList (); 467 ArrayList index = new ArrayList (); 468 469 parseElements.successfulRule=new HashMap (); 470 parseElements.query = query; 471 parseElements.tokenFlag = true; 472 parseElements.bestOptionFlag = false; 473 parseElements.queryArray = queryArray; 474 475 int position = 0 ; 476 while(position < query.length() ){ 477 Object object = null; 478 int prevPosition = position; 479 Object result[] = (Object [])tokenRule.parse(query,position,queryArray,parseElements); 480 object = result[0]; 481 position = result[1].hashCode(); 482 if (object instanceof ParseException){ 483 ParseException pe = (ParseException)object; 484 pe.setQuery(query); 485 if(pe.causeOfFailure == null){ 486 pe.causeOfFailure = ""+queryArray[pe.position>=parseElements.queryArray.length? parseElements.queryArray.length -1 : pe.position]; 487 } 488 if(listOfTokens.size() == 0) 489 throw new DException("DSE2057",null); 490 else if(pe.position < query.length() ){ 491 throw pe; 492 }else{ 493 position = pe.position; 494 object = null; 495 } 496 497 } 498 if ( object != null ){ 499 listOfTokens.add(object); 500 index.add(new Integer (prevPosition)); 501 } 502 } 503 504 Object []o = new Object [2]; 505 o[0] = listOfTokens.toArray(); 506 o[1] = index.toArray(); 507 return o; 508 } 509 510 515 public Object getComparableObject(){ 516 return null; 517 } 518 519 public Object getComparableObjectArray(){ 520 return null; 521 } 522 523 531 532 public Object getRecursiveObject(String nameOfRule,DBStack occuredRules){ 533 return null; 534 } 535 536 544 public Object getNonRecursiveObject(String nameOfRule,DBStack occuredRules){ 545 return null; 546 } 547 548 552 556 562 private void displayTreeFailure(ParseElements pe,boolean found){ 563 String str = found ? (nameOfRule+" - "+pe.recursionState+" Failed ["+pe.position + "]" + "] RETURN TYPE : " +pe.parseException.returnType) : (nameOfRule+" - "+pe.recursionState+" Failed From HashMap "+pe.position); 564 pe.parentNode.setUserObject(str); 565 } 566 567 573 private void displayTreeSuccess(ParseElements pe,int position,String query,boolean found){ 574 String str= ""+pe.position; 575 if ( pe.tokens != null ){ 576 for(int i = position; i < pe.position ; ++i){ 577 try { 578 str += pe.tokens[i].getClass().getName(); 579 } 580 catch (RuntimeException ex) { 581 str = ""+ex; 582 } 583 } 584 } 585 else 586 str += query.substring(position,pe.position)+"]"; 587 str = found ? (nameOfRule+" - "+pe.recursionState+" Successful ["+ str +"]" ) : (nameOfRule+" - "+pe.recursionState+" Successful From HashMap ["+ str+"]"); 588 pe.parentNode.setUserObject(str); 589 } 590 591 594 void loadFields(int i,Class cls) throws DException{ 595 try{ 596 Object arrayOfFields[] = new Object [i+1]; 597 for(;i >= 0 ; i--) 598 arrayOfFields[i] = cls.getDeclaredField((String )fieldNames[i]); 599 fields = arrayOfFields; 600 }catch(Exception e){ 601 throw new DException("DSE0",new Object []{e.getMessage()} ); 602 } 603 } 604 605 609 String updateNameOfRule(String nameRule){ 610 611 char[] value = nameRule.toCharArray(); 612 StringBuffer str = new StringBuffer (); 613 for(int i = 0 ; i < value.length ; i++) 614 if(value[i] == '-' ) 615 str.append('_'); 616 else if(!(value[i] == ' ' || value[i] == ':' || value[i] == '(' || value[i] == ')'|| value[i] == '\\'|| value[i] == '\'')) 617 str.append(value[i]); 618 return str.toString(); 619 } 620 621 624 672 673 677 public boolean checkLookAheadStack(ParseElements pe){ 678 694 return true; 695 } 696 697 700 701 public String toString(){ 702 return nameOfRule; 703 } 704 705 708 709 public boolean equals(Object object){ 710 if(this == object) 711 return true; 712 String name = ((ProductionRules)object).ruleKey; 713 return ruleKey.equalsIgnoreCase(name); 714 } 715 716 public int hashCode(){ 717 int hashCode = 1; 718 hashCode = 31*hashCode + (nameOfRule==null ? 0 : nameOfRule.hashCode()); 719 return hashCode; 720 } 721 722 725 726 public int compareTo(Object o) { 727 ProductionRules object2 = (ProductionRules)o; 728 return ((Comparable )result).compareTo(object2.result); 729 } 730 731 public Object parseComments(ParseElements pe){ 732 int position = pe.position ; 733 char[] val = pe.queryArray ; 734 while(position < pe.queryArray.length && Character.isWhitespace(val[position])) 735 position++; 736 737 try { 738 while (val[position] == '-' && val[position + 1] == '-') { 739 while (val[position] != ';') { 740 position++; 741 } 742 position++; 743 while(position < pe.queryArray.length && Character.isWhitespace(val[position])) 744 position++; 745 } 746 747 while (val[position] == '/' && val[position + 1] == '*') { 748 while (val[position] != '*' || val[position + 1] != '/') { 749 position++; 750 } 751 position += 2; 752 while(position < pe.queryArray.length && Character.isWhitespace(val[position])) 753 position++; 754 } 755 } catch (ArrayIndexOutOfBoundsException ex) { 756 pe.position = position ; 757 pe.parseException.setPosition(pe.getIndexPosition(pe.position)); 758 return pe.parseException; 759 } 760 761 return new Integer (position); 762 } 763 764 } 765 | Popular Tags |