001// lexical analyzer for GSQLParser component java version 002 003/**************************************************** 004 Lexical analizer for GSQLParser Java component 005 Copyright (c) 2004-2017 by Gudu software 006****************************************************/ 007 008package gudusoft.gsqlparser; 009 010import java.util.HashMap; 011import java.io.InputStreamReader; 012 013import java.util.Locale; 014import java.io.BufferedReader; 015import java.io.IOException; 016 017 018public class TLexerOracle extends TCustomLexer{ 019 static int yynmarks = 0 ; 020 static int yynmatches ; 021 static int yyntrans ; 022 static int yynstates ; 023 static int[] yyk,yym ; // 1 based 024 static int[] yytint; // 1 based 025 static TYytRec[] yyt ; // 1 based 026 static int[] yykl,yykh,yyml,yymh,yytl,yyth ; // 0 based 027 private static String[] keywordlist; 028 static String table_file; 029 static HashMap<String, Integer> keywordValueList; 030 static HashMap<Integer, Integer> keywordTypeList; 031 032 static int[][] yystateTable; 033 034 static { 035 keywordValueList = new HashMap<String, Integer>(); 036 keywordTypeList = new HashMap<Integer, Integer>(); 037 table_file = "/gudusoft/gsqlparser/parser/oracle/oracle_lex_table.txt"; 038 if (TBaseType.enterprise_edition||TBaseType.oracle_edition){ 039 inittable(); 040 } 041 } 042 043 public TLexerOracle(){ 044 super(); 045 dbvendor = EDbVendor.dbvoracle; 046 } 047 048public boolean canBeColumnName(int tokencode){ 049 //http://blog.csdn.net/superbeck/article/details/5387476 050 boolean ret = false; 051 int modifiers = keyword_type_identifier | keyword_type_column ; 052 Integer s = keywordTypeList.get(tokencode); 053 if (s != null){ 054 int modifier = s; 055 ret = (modifiers & modifier) == modifier; 056 } 057 058 return ret; 059} 060 061public boolean matchOracleQuoteDelimiter(char openchar,char closechar){ 062 if (openchar == '[') return closechar == ']'; 063 if (openchar == '{') return closechar == '}'; 064 if (openchar == '<') return closechar == '>'; 065 if (openchar == '(') return closechar == ')'; 066 return openchar == closechar; 067} 068 069 public int iskeyword(String str){ 070 int ret = -1; 071 Integer s = keywordValueList.get(str.toUpperCase(Locale.ENGLISH)); 072 if( s != null){ 073 ret = s; 074 } 075 return ret;// -1 means not a keyword 076 } 077 078 public static EKeywordType getKeywordType(String keyword){ 079 return TCustomLexer.getKeywordType(keyword,keywordValueList,keywordTypeList); 080 } 081 082 public int getkeywordvalue(String keyword){ 083 int ret = 0; 084 Integer s = keywordValueList.get(keyword.toUpperCase(Locale.ENGLISH)); 085 if( s != null){ 086 ret = s; 087 } 088 return ret;// 0 means not a keyword 089 } 090 091 static void yystateLookupConfigure() { 092 int yystates = yytl.length; 093 yystateTable = new int[257][yystates]; 094 095 // initialize to empty 096 for(int i = 0; i < yystates; i++) { 097 for (int j = 0; j < 257; j++) 098 yystateTable[j][i] = -1; 099 } 100 101 for(int i = 0; i < yystates; i++) { 102 int low = yytl[i]; 103 int high = yyth[i]; 104 for (int j = low; j <= high; j++) { 105 for (char c: yyt[j].cc) { 106 yystateTable[c][i] = j; 107 } 108 } 109 } 110 } 111 112 int yylex(){ 113 int yyn; 114 while (true) { // top level while 115 yynew(); 116 while (true){ //scan 117 for(yyn = yykl[yystate]; yyn <= yykh[yystate]; yyn++){ 118 yymark(yyk[yyn]); 119 } 120 121 for(yyn=yymh[yystate]; yyn>= yyml[yystate]; yyn--){ 122 yymatch(yym[yyn]); 123 } 124 125 if(yytl[yystate] > yyth[yystate]){ 126 break; 127 } 128 129 yyscan(); 130// yyn = yytl[yystate]; 131 totablechar(); 132// while( (yyn <= yyth[yystate]) && (!(charinarray(yytablechar,yyt[yyn].cc))) ){ 133// yyn++; 134// } 135// if (yyn > yyth[yystate]){ 136// break; 137// } 138 139 yyn = yystateTable[yytablechar][yystate]; 140 if (yyn == -1) 141 break; 142 143 yystate = yyt[yyn].s; 144 } //scan 145 146 while (true){ //action 147 int yyrule; 148 if ( (yyrule = yyfind()) != -1 ){ 149 yyaction(yyrule); 150 if (yyreject){ 151 continue; 152 } 153 }else if( (!yydefault() ) && (yywrap()) ){ 154 yyclear(); 155 returni(0); 156 } 157 break; 158 } 159 160 if (!yydone) { 161 continue; 162 } 163 break; 164 } // top level while 165 166 return yyretval; 167 } 168 169 static void inittable(){ 170 171 //if (yynmarks > 0) return; //init table already 172 173 String line; 174 boolean inyyk=false,inyym=false,inyykl=false,inyykh=false,inyyml=false,inyymh=false,inyytl=false,inyyth=false,inyytint=false,inyyt=false,inkeyword=false; 175 int yyk_count=0,yym_count=0,yykl_count=0,yykh_count=0,yyml_count=0,yymh_count=0,yytl_count=0,yyth_count=0,yytint_count=0,yyt_count=0; 176 int c=0; 177 keywordValueList.clear(); 178 keywordTypeList.clear(); 179 180 BufferedReader br = new BufferedReader(new InputStreamReader(TLexerOracle.class.getResourceAsStream(table_file))); 181 182 try{ 183 while( (line = br.readLine()) != null){ 184 if (line.trim().startsWith("yynmarks=")){ 185 String[] ss = line.split("[=;]"); 186 yynmarks=Integer.parseInt(ss[1].trim()); 187 yyk = new int[yynmarks+1]; 188 }else if (line.trim().startsWith("yynmatches=")){ 189 String[] ss = line.split("[=;]"); 190 yynmatches=Integer.parseInt(ss[1].trim()); 191 yym = new int[yynmatches+1]; 192 }else if (line.trim().startsWith("yyntrans=")){ 193 String[] ss = line.split("[=;]"); 194 yyntrans=Integer.parseInt(ss[1].trim()); 195 yytint = new int[yyntrans+1]; 196 yyt = new TYytRec[yyntrans+1]; 197 }else if (line.trim().startsWith("yynstates=")){ 198 String[] ss = line.split("[=;]"); 199 yynstates=Integer.parseInt(ss[1].trim()); 200 yykl = new int[yynstates]; 201 yykh = new int[yynstates]; 202 yyml = new int[yynstates]; 203 yymh = new int[yynstates]; 204 yytl = new int[yynstates]; 205 yyth = new int[yynstates]; 206 }else if (line.trim().startsWith("<end>")){ 207 if (inyyk){ 208 inyyk = false; 209 if (yynmarks+1 != yyk_count ){ 210 System.out.println("required1:"+(yynmarks)+" actually:"+(yyk_count-1)); 211 } 212 } 213 else if(inyym){ 214 inyym = false; 215 if (yynmatches+1 != yym_count ){ 216 System.out.println("required2:"+(yynmatches)+" actually:"+(yym_count-1)); 217 } 218 } 219 else if(inyykl){ 220 inyykl = false; 221 if (yynstates != yykl_count ){ 222 System.out.println("required3:"+(yynstates)+" actually:"+(yykl_count)); 223 } 224 } 225 else if(inyykh){ 226 inyykh = false; 227 if (yynstates != yykh_count ){ 228 System.out.println("required4:"+(yynstates)+" actually:"+(yykh_count)); 229 } 230 } 231 else if(inyyml){ 232 inyyml = false; 233 if (yynstates != yyml_count ){ 234 System.out.println("required5:"+(yynstates)+" actually:"+(yyml_count)); 235 } 236 } 237 else if(inyymh){ 238 inyymh = false; 239 if (yynstates != yymh_count ){ 240 System.out.println("required:"+(yynstates)+" actually:"+(yymh_count)); 241 } 242 } 243 else if(inyytl){ 244 inyytl = false; 245 if (yynstates != yytl_count ){ 246 System.out.println("required6:"+(yynstates)+" actually:"+(yytl_count)); 247 } 248 } 249 else if(inyyth){ 250 inyyth = false; 251 if (yynstates != yyth_count ){ 252 System.out.println("required7:"+(yynstates)+" actually:"+(yyth_count)); 253 } 254 } 255 else if(inyytint){ 256 inyytint = false; 257 if (yyntrans + 1 != yytint_count ){ 258 System.out.println("required8:"+(yyntrans)+" actually:"+(yytint_count-1)); 259 } 260 } 261 else if(inyyt){ 262 inyyt = false; 263 if (yyntrans+1 != yyt_count ){ 264 System.out.println("required9:"+(yyntrans)+" actually:"+(yyt_count-1)); 265 } 266 } 267 else if(inkeyword){ 268 inkeyword = false; 269 } 270 }else if(line.trim().startsWith("yyk =")){ 271 inyyk = true; 272 }else if(line.trim().startsWith("yym =")){ 273 inyym = true; 274 }else if(line.trim().startsWith("yykl =")){ 275 inyykl = true; 276 }else if(line.trim().startsWith("yykh =")){ 277 inyykh = true; 278 }else if(line.trim().startsWith("yyml =")){ 279 inyyml = true; 280 }else if(line.trim().startsWith("yymh =")){ 281 inyymh = true; 282 }else if(line.trim().startsWith("yytl =")){ 283 inyytl = true; 284 }else if(line.trim().startsWith("yyth =")){ 285 inyyth = true; 286 }else if(line.trim().startsWith("yytint =")){ 287 inyytint = true; 288 }else if(line.trim().startsWith("yyt =")){ 289 inyyt = true; 290 }else if(line.trim().startsWith("keywordsvalue =")){ 291 inkeyword = true; 292 }else if(inyyk){ 293 String[] ss = line.split("[,]"); 294 for(int j=0;j<ss.length;j++){ 295 // System.out.println(ss[j].trim()); 296 yyk[yyk_count++] = Integer.parseInt(ss[j].trim()); 297 } 298 }else if(inyym){ 299 String[] ss = line.split("[,]"); 300 for(int j=0;j<ss.length;j++){ 301 // System.out.println(ss[j].trim()); 302 yym[yym_count++] = Integer.parseInt(ss[j].trim()); 303 } 304 }else if(inyykl){ 305 String[] ss = line.split("[,]"); 306 for(int j=0;j<ss.length;j++){ 307 // System.out.println(ss[j].trim()); 308 yykl[yykl_count++] = Integer.parseInt(ss[j].trim()); 309 } 310 }else if(inyykh){ 311 String[] ss = line.split("[,]"); 312 for(int j=0;j<ss.length;j++){ 313 // System.out.println(ss[j].trim()); 314 yykh[yykh_count++] = Integer.parseInt(ss[j].trim()); 315 } 316 }else if(inyyml){ 317 String[] ss = line.split("[,]"); 318 for(int j=0;j<ss.length;j++){ 319 // System.out.println(ss[j].trim()); 320 yyml[yyml_count++] = Integer.parseInt(ss[j].trim()); 321 } 322 }else if(inyymh){ 323 String[] ss = line.split("[,]"); 324 for(int j=0;j<ss.length;j++){ 325 // System.out.println(ss[j].trim()); 326 yymh[yymh_count++] = Integer.parseInt(ss[j].trim()); 327 } 328 }else if(inyytl){ 329 String[] ss = line.split("[,]"); 330 for(int j=0;j<ss.length;j++){ 331 // System.out.println(ss[j].trim()); 332 yytl[yytl_count++] = Integer.parseInt(ss[j].trim()); 333 } 334 }else if(inyyth){ 335 String[] ss = line.split("[,]"); 336 for(int j=0;j<ss.length;j++){ 337 // System.out.println(ss[j].trim()); 338 yyth[yyth_count++] = Integer.parseInt(ss[j].trim()); 339 } 340 }else if(inyytint){ 341 String[] ss = line.split("[,]"); 342 for(int j=0;j<ss.length;j++){ 343 // System.out.println(ss[j].trim()); 344 yytint[yytint_count++] = Integer.parseInt(ss[j].trim()); 345 } 346 }else if(inyyt){ 347 //System.out.println(line.trim()); 348 349 c = 0; 350 String[] st = line.trim().split(",,"); 351 char[] tmp = new char[st.length]; 352 for(int i=0;i<st.length;i++){ 353 354 if(st[i].startsWith("\'")) { 355 if(st[i].length() == 3){ // 'a' 356 tmp[c++] = st[i].charAt(1); 357 }else if(st[i].length() == 4) { // '\\' 358 tmp[c++] = st[i].charAt(2); 359 }else{ 360 System.out.println(" read yytstr error, error string is "+st[i]+ "line: "+ yyt_count); 361 } 362 }else{ 363 try{ 364 tmp[c++] = (char)Integer.parseInt(st[i]); // char in number like 32 that represent space 365 } catch (NumberFormatException nfe) { 366 System.out.println("NumberFormatException: " + nfe.getMessage()); 367 } 368 } 369 } //while hasmoreTokens 370 371 //yyt[lineno] = new YYTrec(tmp,yytint[lineno]); 372 yyt[yyt_count] = new TYytRec(tmp,yytint[yyt_count]); 373 yyt_count++; 374 375 }else if(inkeyword){ 376 String[] ss =line.split("[=]"); 377 378 int val1 = -1; 379 int val2 = -1; 380 try { 381 val1 = Integer.parseInt(ss[1]); 382 val2 = Integer.parseInt(ss[2]); 383 } 384 catch (NumberFormatException nfe) { 385 System.out.println("NumberFormatException: " + nfe.getMessage()); 386 } 387 keywordValueList.put(ss[0].toUpperCase(),val1); 388 keywordTypeList.put(val1,val2); 389 } 390 } 391 }catch(IOException e){ 392 System.out.println(e.toString()); 393 } 394 yystateLookupConfigure(); 395 } 396 397 398 void yyaction(int yyruleno){ 399 400 401 int ic; 402 char[] tmparray = {'=','+','-','*','/','>','<'}; 403 404 yylvalstr = getyytext(); 405 /* actions: */ 406 switch(yyruleno){ 407 case 1: 408 409 { 410 addlit(yylvalstr,yytextlen); 411 if (xcdepth <= 0) 412 { 413 start(init); 414 yylvalstr = litbufdup(); 415 returni(cmtslashstar); 416 } 417 else 418 xcdepth--; 419 420 break; 421 } 422 423 424 case 2: 425 426 { 427 if (yylvalstr.equalsIgnoreCase("/*+")){ 428 //xcdepth++; 429 yyless(2); 430 addlit(yylvalstr,yytextlen); 431 }else{ 432 yyless(1); 433 addlit(yylvalstr,1); 434 } 435 436 break; 437 438 } 439 440 case 3: 441 442 { 443 444 if (getyysstate() == xq) 445 { 446 nchars = yytextlen; 447 addlit(yylvalstr, yytextlen-1); 448 yyless(nchars-1); 449 return;//exit; 450 } 451 452 xcdepth = 0; 453 start(xc); 454 startlit(); 455 yyless(2); 456 addlit(yylvalstr,yytextlen); 457 458 break; 459 } 460 461 case 4: 462 463 { 464 addlit(yylvalstr,yytextlen); 465 466 break; 467 } 468 469 case 5: 470 471 { 472 addlitchar(yylvalstr.charAt(0)); 473 474 break; 475 } 476 477 case 6: 478 479 { 480 start(init); 481 addlit(yylvalstr, yytextlen); 482 yylvalstr = litbufdup(); 483 returni(sconst); 484 break; 485 } 486 487 case 7: 488 489 { 490 if (insqlpluscmd){ 491 yyless(0); 492 yylvalstr = litbufdup(); 493 start(init); 494 returni(sconst); 495 }else{ 496 addlit(yylvalstr,yytextlen); 497 } 498 499 break; 500 } 501 case 8: 502 503 { 504 if ((getyysstate() == xq)||(getyysstate() == xqq)) 505 { 506 nchars = yytextlen; 507 addlit(yylvalstr, yytextlen-1); 508 yyless(nchars-1); 509 return;//exit; 510 } 511 512 start(xq); 513 startlit(); 514 addlit(yylvalstr,yytextlen); 515 break; 516 } 517 518 case 9: 519 520 { 521 if (getyysstate() == xq) 522 { 523 nchars = yytextlen; 524 addlit(yylvalstr, yytextlen-1); 525 yyless(nchars-1); 526 return;//exit; 527 } 528 start(xqq); 529 startlit(); 530 addlit(yylvalstr,yytextlen); 531 break; 532 } 533 534 case 10: 535 536 { 537 addlit(yylvalstr, yytextlen); 538 break; 539 } 540 541 case 11: 542 543 { 544 545 if (matchOracleQuoteDelimiter(literalbuf.charAt(3-1) 546 ,literalbuf.charAt(literalbuf.length() -1)) 547 && (3 != literalbuf.length()) ) 548 { 549 start(init); 550 addlit(yylvalstr, yytextlen); 551 yylvalstr = litbufdup(); 552 returni (sconst); 553 554 } 555 else 556 { 557 addlit(yylvalstr, yytextlen); 558 } 559 560 break; 561 } 562 563 564 case 12: 565 566 { 567 start(xq); 568 startlit(); 569 addlit(yylvalstr, yytextlen); 570 dummych1 = get_char(); 571 if (dummych1 == '\\') // recognize string like '\' 572 { 573 dummych2 = get_char(); 574 if (dummych2 == '\'') 575 { 576 start(init); 577 addlit("\\", 1); 578 addlit("\'", 1); 579 yylvalstr = litbufdup(); 580 returni(sconst); 581 } 582 else 583 { 584 unget_char(dummych2); 585 unget_char(dummych1); 586 } 587 } 588 else 589 { unget_char(dummych1);} 590 591 break; 592 } 593 594 case 13: 595 596 { 597 addlit(yylvalstr, yytextlen); 598 break; 599 } 600 601 case 14: 602 603 { 604 dummych1 = get_char(); 605 unget_char(dummych1); 606 if (dummych1 == (char)10) 607 { 608 if (insqlpluscmd){ 609 nchars = yytextlen; 610 if(yylvalstr.charAt(nchars-1) == (char)13){ 611 yyless(nchars - 1); 612 yylvalstr = yylvalstr.substring(0,nchars); 613 } 614 start(init); 615 addlit(yylvalstr, nchars-1); 616 yylvalstr = litbufdup(); 617 returni(sconst); //in sqlplus command, characters between ' and return is treated as a string 618 619 }else{ 620 dummych1 = get_char(); 621 addlit(yylvalstr+dummych1, yytextlen+1); 622 } 623 } else if (dummych1 == '\\') 624 { 625 //dummych1 = get_char(); 626 //dummych2 = get_char(); 627 //addlit(yylvalstr+dummych1+dummych2, yytextlen+2); 628 addlit(yylvalstr, yytextlen); 629 } 630 else 631 { addlit(yylvalstr, yytextlen);} 632 633 break; 634 } 635 636 case 15: 637 638 { 639 addlit(yylvalstr, yytextlen); 640 break; 641 } 642 643 644 645 case 16: 646 647 { 648 start(init); 649 addlit(yylvalstr, yytextlen); 650 if ((literallen == 0) && (!insqlpluscmd)) 651 {returni (error);} 652 if (literallen >= namedatalen) 653 { 654 setlengthofliteralbuf(namedatalen); 655 literallen = namedatalen; 656 } 657 yylvalstr = litbufdup(); 658 returni (ident); 659 660 break; 661 } 662 663 664 case 17: 665 666 { 667 if (insqlpluscmd){ 668 yyless(0); 669 yylvalstr = litbufdup(); 670 start(init); 671 returni(sconst); 672 }else{ 673 addlit(yylvalstr, yytextlen); 674 } 675 676 break; 677 } 678 679 case 18: 680 681 { 682 addlit(yylvalstr, yytextlen); 683 break; 684 } 685 686 case 19: 687 688 { 689 start(xd); 690 startlit(); 691 addlit(yylvalstr, yytextlen); 692 break; 693 } 694 695 case 20: 696 697 { 698 dummych1 = get_char(); 699 unget_char(dummych1); 700 if (dummych1 == (char)10) 701 { 702 if (insqlpluscmd){ 703 nchars = yytextlen; 704 if(yylvalstr.charAt(nchars-1) == (char)13){ 705 yyless(nchars - 1); 706 yylvalstr = yylvalstr.substring(0,nchars); 707 } 708 start(init); 709 addlit(yylvalstr, nchars-1); 710 yylvalstr = litbufdup(); 711 returni(sconst); //in sqlplus command, characters between ' and return is treated as a string 712 713 }else{ 714 dummych1 = get_char(); 715 addlit(yylvalstr+dummych1, yytextlen+1); 716 } 717 718 } else 719 addlit(yylvalstr, yytextlen); 720 721 break; 722 } 723 724 case 21: 725 726 { 727 returni(lexnewline); 728 break; 729 } 730 731 case 22: 732 733 { 734 returni(lexspace); 735 break; 736 } 737 738 case 23: 739 740 { 741 if ((getyysstate() == xq) 742 || (getyysstate() == xd) 743 || (getyysstate() == xc) 744 ) 745 { 746 addlit(yylvalstr, 1); 747 yyless(1); 748 return;//exit; 749 } 750 751 returni(cmtdoublehyphen); 752 break; 753 } 754 755 case 24: 756 757 { 758 returnc( lexer_charAt(yylvalstr,0)); 759 break; 760 } 761 762 case 25: 763 764 { 765 returni(cmpop); 766 break; 767 } 768 769 case 26: 770 771 { 772 returni(concatenationop); 773 break; 774 } 775 776 case 27: 777 778 { 779 780 if (getyysstate() == xc) 781 { 782 slashstar = yylvalstr.indexOf("*/"); 783 if (slashstar >= 0) 784 { 785 start(init); 786 addlit(yylvalstr,slashstar+2); 787 yylvalstr = litbufdup(); 788 yyless(slashstar+2); 789 returni(cmtslashstar); 790 } 791 else 792 { 793 addlit(yylvalstr,1); 794 yyless(1); 795 } 796 } 797 else if (getyysstate() == xq) 798 { 799 addlit(yylvalstr,1); 800 yyless(1); 801 } 802 else 803 { 804 nchars = yytextlen; 805 slashstar = yylvalstr.indexOf("/*"); 806 dashdash = yylvalstr.indexOf("--"); 807 if ((slashstar > 0) && (dashdash > 0)) 808 { 809 //if both appear, take the first one 810 if (slashstar > dashdash) 811 { 812 slashstar = dashdash; 813 } 814 } 815 else 816 { 817 // if slashstar=0 then slashstar := dashdash; 818 // add (getyysstate <> xc) to avoid something like this */--,here */ should be handled instead of -- 819 if ((slashstar > 0) && (getyysstate() != xc)) 820 { 821 nchars = slashstar; 822 } 823 } 824 825 while ((nchars > 1) 826 && ( (yylvalstr.charAt(nchars-1) == '+' ) 827 || (yylvalstr.charAt(nchars-1) =='-')) 828 && (getyysstate() != xc)) 829 { 830 for (ic = nchars - 1; ic>=1; ic--) 831 { 832 if (isopchar(yylvalstr.charAt(ic-1))) break; 833 } 834 if (ic >= 1) break; 835 nchars--; 836 } 837 838 if (nchars < yytextlen) 839 { 840 //Strip the unwanted chars from the token 841 yyless(nchars); 842 yylvalstr = yylvalstr.substring(0,nchars); 843 } 844 845 ///* 846 // * If what we have left is only one char, and it's 847 // * one of the characters matching "self", then 848 // * return it as a character token the same way 849 // * that the "self" rule would have. 850 // * make sure @ return as self char, by james wang 851 // */ 852 if ((nchars == 1) && (isselfchar(yylvalstr.charAt(0)) || (yylvalstr.charAt(0) == '@'))) 853 { 854 returnc(lexer_charAt(yylvalstr,0)); 855 } 856 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '<' ) && 857 (!((yylvalstr.charAt(1) == '<')||(yylvalstr.charAt(1) == '=')||(yylvalstr.charAt(1) == '>')||(yylvalstr.charAt(1) == '-')||(yylvalstr.charAt(1) == '#'))) 858 ) 859 { 860 yyless(1); 861 returnc(lexer_charAt(yylvalstr,0)); 862 } 863 // Handle <-X where X is not > - return just < and let - be processed separately 864 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '<' ) && (yylvalstr.charAt(1) == '-') && 865 (nchars == 2 || yylvalstr.charAt(2) != '>')) 866 { 867 yyless(1); 868 returnc(lexer_charAt(yylvalstr,0)); 869 } 870 // Handle <#X where X is not > - return just < and let # be processed separately 871 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '<' ) && (yylvalstr.charAt(1) == '#') && 872 (nchars == 2 || yylvalstr.charAt(2) != '>')) 873 { 874 yyless(1); 875 returnc(lexer_charAt(yylvalstr,0)); 876 } 877 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '>' ) && 878 (!((yylvalstr.charAt(1) == '>')||(yylvalstr.charAt(1) == '='))) 879 ) 880 { 881 yyless(1); 882 returnc(lexer_charAt(yylvalstr,0)); 883 } 884 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '+' )) 885 { 886 yyless(1); 887 returnc(lexer_charAt(yylvalstr,0)); 888 } 889 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '-' )) 890 { 891 yyless(1); 892 returnc(lexer_charAt(yylvalstr,0)); 893 } 894 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '*' )) 895 { 896 yyless(1); 897 returnc(lexer_charAt(yylvalstr,0)); 898 } 899 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '/' )) 900 { 901 yyless(1); 902 returnc(lexer_charAt(yylvalstr,0)); 903 } 904 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '?')) 905 { 906 yyless(1); 907 returnc(lexer_charAt(yylvalstr,0)); 908 } 909 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '=' ) && (yylvalstr.charAt(1) == '-' )) 910 { 911 yyless(1); 912 returnc(lexer_charAt(yylvalstr,0)); 913 } 914 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '=' ) && (yylvalstr.charAt(1) == '+' )) 915 { 916 yyless(1); 917 returnc(lexer_charAt(yylvalstr,0)); 918 } 919 else if ( (nchars >= 3) && (yylvalstr.charAt(nchars-1) == '$' ) && (yylvalstr.charAt(nchars-2) == '$' )) 920 { // =$$abc 921 if (nchars == 3){ 922 yyless(1); 923 returnc(lexer_charAt(yylvalstr,0)); 924 }else{ 925 yyless(nchars-2); 926 yylvalstr = yylvalstr.substring(0,nchars-2); 927 928 if (yylvalstr.equalsIgnoreCase("||")){ 929 returni(concatenationop); 930 }else 931 returni(cmpop); 932 } 933 } 934 else if ( 935 (nchars >= 2) 936 &&( 937 charinarray(yylvalstr.charAt(nchars-1-1), tmparray) 938 && ((yylvalstr.charAt(nchars-1) == ':')||(yylvalstr.charAt(nchars-1) == '.')) 939 ) 940 ) 941 { 942 if (nchars < 4) 943 { 944 yyless(nchars-1); 945 yylvalstr = yylvalstr.substring(0,nchars-1); 946 if (nchars == 2) 947 returnc(lexer_charAt(yylvalstr,0)); 948 else 949 returni(op); 950 }else{ 951 yyless(2); 952 yylvalstr = yylvalstr.substring(0,2); 953 returni(cmpop); 954 } 955 } 956 else if ( 957 (nchars >= 2) 958 && ( 959 charinarray(yylvalstr.charAt(nchars-1-1),tmparray) 960 && (yylvalstr.charAt(nchars-1) == '&') 961 ) 962 ) 963 { 964 yyless(nchars-1); 965 yylvalstr = yylvalstr.substring(0,nchars-1); 966 if (nchars == 2) 967 returnc(lexer_charAt(yylvalstr,0)); 968 else 969 returni(op); 970 } 971 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '.') && (yylvalstr.charAt(1) == '*')) 972 { 973 yyless(1); 974 returnc(lexer_charAt(yylvalstr,0)); 975 } 976 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '=') && (yylvalstr.charAt(1) == '?')) 977 { 978 yyless(1); 979 returnc(lexer_charAt(yylvalstr,0)); 980 } 981 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '<') && ((yylvalstr.charAt(1) != '=')&&(yylvalstr.charAt(1) != '<')&&(yylvalstr.charAt(1) != '>'))) 982 { 983 yyless(1); 984 returnc(lexer_charAt(yylvalstr,0)); 985 } 986 else if ( (nchars == 2) && ((yylvalstr.charAt(0) == '+')||(yylvalstr.charAt(0) == '-')||(yylvalstr.charAt(0) == '*')||(yylvalstr.charAt(0) == '/')) && (yylvalstr.charAt(1) == '?')) 987 { 988 yyless(1); 989 returnc(lexer_charAt(yylvalstr,0)); 990 } 991 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '@')) 992 { 993 yyless(1); 994 returnc(lexer_charAt(yylvalstr,0)); 995 } 996 else if ( (nchars >= 2) && (yylvalstr.charAt(0)== '|') && (yylvalstr.charAt(1) == '|')) 997 { //||--sss ,just get || only 998 yyless(2); 999 yylvalstr = yylvalstr.substring(0,2); 1000 returni(concatenationop); 1001 } 1002 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '!') && (yylvalstr.charAt(1) == '=')) 1003 { 1004 yyless(2); 1005 yylvalstr = yylvalstr.substring(0,2); 1006 returni(cmpop); 1007 } 1008 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '>') && (yylvalstr.charAt(1) == '=')) 1009 { 1010 yyless(2); 1011 yylvalstr = yylvalstr.substring(0,2); 1012 returni(cmpop); 1013 } 1014 else if ( (nchars >= 3) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '=') && (yylvalstr.charAt(2) == '>')) 1015 { // <=> Oracle vector cosine distance operator 1016 yyless(3); 1017 yylvalstr = yylvalstr.substring(0,3); 1018 returni(1262); // VECTOR_COSINE_DISTANCE 1019 } 1020 else if ( (nchars >= 3) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '-') && (yylvalstr.charAt(2) == '>')) 1021 { // <-> Oracle vector euclidean distance operator 1022 yyless(3); 1023 yylvalstr = yylvalstr.substring(0,3); 1024 returni(1263); // VECTOR_EUCLIDEAN_DISTANCE 1025 } 1026 else if ( (nchars >= 3) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '#') && (yylvalstr.charAt(2) == '>')) 1027 { // <#> Oracle vector negative dot product operator 1028 yyless(3); 1029 yylvalstr = yylvalstr.substring(0,3); 1030 returni(1264); // VECTOR_DOT_PRODUCT 1031 } 1032 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '=')) 1033 { 1034 yyless(2); 1035 yylvalstr = yylvalstr.substring(0,2); 1036 returni(cmpop); 1037 } 1038 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '>')) 1039 { 1040 yyless(2); 1041 yylvalstr = yylvalstr.substring(0,2); 1042 returni(cmpop); 1043 } 1044 else if ( (nchars >= 2) && (yylvalstr.charAt(0)== '~') && (yylvalstr.charAt(1) == '=')) 1045 { 1046 yyless(2); 1047 yylvalstr = yylvalstr.substring(0,2); 1048 returni(cmpop); 1049 } 1050 else if ( (nchars >= 2) && (yylvalstr.charAt(0)== '^') && (yylvalstr.charAt(1) == '=')) 1051 { 1052 yyless(2); 1053 yylvalstr = yylvalstr.substring(0,2); 1054 returni(cmpop); 1055 } 1056 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '.') && (yylvalstr.charAt(1) == '.')) 1057 { 1058 yyless(2); 1059 yylvalstr = yylvalstr.substring(0,2); 1060 returni(op); 1061 } 1062 else if (((nchars > 2) && (yylvalstr.charAt(0) == '*')) 1063 && (yylvalstr.charAt(1) == '/') 1064 && (getyysstate() == xc) 1065 ) 1066 { //in comment, and find */ , then it must the end of comment 1067 yyless(2); 1068 addlit(yylvalstr,yytextlen); 1069 if (xcdepth <= 0) 1070 { 1071 start(init); 1072 yylvalstr = litbufdup(); 1073 returni(cmtslashstar); 1074 } 1075 else 1076 xcdepth--; 1077 } 1078 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '>') && (yylvalstr.charAt(1) == '>')) 1079 { // >><<, >> followed by more operators - split off >> for label_end 1080 yyless(2); 1081 yylvalstr = yylvalstr.substring(0,2); 1082 returni(op); 1083 } 1084 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '<')) 1085 { // <<>>, << followed by more operators - split off << for label_begin 1086 yyless(2); 1087 yylvalstr = yylvalstr.substring(0,2); 1088 returni(op); 1089 } 1090 else 1091 returni(op); 1092 } 1093 1094 break; 1095 } 1096 1097 case 28: 1098 1099 { 1100 returni(iconst); 1101 break; 1102 } 1103 1104 case 29: 1105 1106 { 1107 ///* for i in 1..5 loop, we can't recognize 1. as a decimal,but 1 as decimal 1108 nchars = yytextlen; 1109 if (yylvalstr.charAt(nchars-1) == '.') 1110 { 1111 dummych1 = get_char(); 1112 unget_char(dummych1); 1113 if (dummych1 == '.') 1114 { 1115 yyless(nchars-1); 1116 yylvalstr = yylvalstr.substring(0,nchars - 1); 1117 returni (iconst); 1118 return;//exit; 1119 } 1120 } 1121 returni (fconst); 1122 break; 1123 } 1124 1125 case 30: 1126 1127 { 1128 returni (fconst); 1129 break; 1130 } 1131 1132 case 31: 1133 1134 { 1135 int rw; 1136 if ( (rw = iskeyword(yylvalstr)) != -1) { returni(rw);} 1137 else 1138 {returni(ident);} 1139 break; 1140 } 1141 1142 case 32: 1143 1144 { 1145 returni (outer_join); 1146 break; 1147 } 1148 1149 1150 case 33: 1151 1152 { 1153 returni (k_clause); 1154 break; 1155 } 1156 1157 case 34: 1158 1159 { 1160 returni (m_clause); 1161 break; 1162 } 1163 1164 1165 case 35: 1166 1167 { 1168 returni (bind_v); 1169 break; 1170 } 1171 1172 case 36: 1173 1174 { 1175 if ((getyysstate() == xq) 1176 || (getyysstate() == xd) 1177 || (getyysstate() == xc) 1178 ) 1179 { 1180 addlit(yylvalstr, 1); 1181 yyless(1); 1182 return;//exit; 1183 } 1184 returni (ident); 1185 break; 1186 } 1187 1188 case 37: 1189 1190 { 1191 returni (error); 1192 break; 1193 } 1194 1195 default:{ 1196 System.out.println("fatal error in yyaction"); 1197 } 1198 }//switch 1199}/*yyaction*/; 1200 1201 1202 1203 }