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) == '>'))) 858 ) 859 { 860 yyless(1); 861 returnc(lexer_charAt(yylvalstr,0)); 862 } 863 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '>' ) && 864 (!((yylvalstr.charAt(1) == '>')||(yylvalstr.charAt(1) == '='))) 865 ) 866 { 867 yyless(1); 868 returnc(lexer_charAt(yylvalstr,0)); 869 } 870 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '+' )) 871 { 872 yyless(1); 873 returnc(lexer_charAt(yylvalstr,0)); 874 } 875 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '-' )) 876 { 877 yyless(1); 878 returnc(lexer_charAt(yylvalstr,0)); 879 } 880 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '*' )) 881 { 882 yyless(1); 883 returnc(lexer_charAt(yylvalstr,0)); 884 } 885 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '/' )) 886 { 887 yyless(1); 888 returnc(lexer_charAt(yylvalstr,0)); 889 } 890 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '?')) 891 { 892 yyless(1); 893 returnc(lexer_charAt(yylvalstr,0)); 894 } 895 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '=' ) && (yylvalstr.charAt(1) == '-' )) 896 { 897 yyless(1); 898 returnc(lexer_charAt(yylvalstr,0)); 899 } 900 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '=' ) && (yylvalstr.charAt(1) == '+' )) 901 { 902 yyless(1); 903 returnc(lexer_charAt(yylvalstr,0)); 904 } 905 else if ( (nchars >= 3) && (yylvalstr.charAt(nchars-1) == '$' ) && (yylvalstr.charAt(nchars-2) == '$' )) 906 { // =$$abc 907 if (nchars == 3){ 908 yyless(1); 909 returnc(lexer_charAt(yylvalstr,0)); 910 }else{ 911 yyless(nchars-2); 912 yylvalstr = yylvalstr.substring(0,nchars-2); 913 914 if (yylvalstr.equalsIgnoreCase("||")){ 915 returni(concatenationop); 916 }else 917 returni(cmpop); 918 } 919 } 920 else if ( 921 (nchars >= 2) 922 &&( 923 charinarray(yylvalstr.charAt(nchars-1-1), tmparray) 924 && ((yylvalstr.charAt(nchars-1) == ':')||(yylvalstr.charAt(nchars-1) == '.')) 925 ) 926 ) 927 { 928 if (nchars < 4) 929 { 930 yyless(nchars-1); 931 yylvalstr = yylvalstr.substring(0,nchars-1); 932 if (nchars == 2) 933 returnc(lexer_charAt(yylvalstr,0)); 934 else 935 returni(op); 936 }else{ 937 yyless(2); 938 yylvalstr = yylvalstr.substring(0,2); 939 returni(cmpop); 940 } 941 } 942 else if ( 943 (nchars >= 2) 944 && ( 945 charinarray(yylvalstr.charAt(nchars-1-1),tmparray) 946 && (yylvalstr.charAt(nchars-1) == '&') 947 ) 948 ) 949 { 950 yyless(nchars-1); 951 yylvalstr = yylvalstr.substring(0,nchars-1); 952 if (nchars == 2) 953 returnc(lexer_charAt(yylvalstr,0)); 954 else 955 returni(op); 956 } 957 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '.') && (yylvalstr.charAt(1) == '*')) 958 { 959 yyless(1); 960 returnc(lexer_charAt(yylvalstr,0)); 961 } 962 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '=') && (yylvalstr.charAt(1) == '?')) 963 { 964 yyless(1); 965 returnc(lexer_charAt(yylvalstr,0)); 966 } 967 else if ( (nchars == 2) && (yylvalstr.charAt(0) == '<') && ((yylvalstr.charAt(1) != '=')&&(yylvalstr.charAt(1) != '<')&&(yylvalstr.charAt(1) != '>'))) 968 { 969 yyless(1); 970 returnc(lexer_charAt(yylvalstr,0)); 971 } 972 else if ( (nchars == 2) && ((yylvalstr.charAt(0) == '+')||(yylvalstr.charAt(0) == '-')||(yylvalstr.charAt(0) == '*')||(yylvalstr.charAt(0) == '/')) && (yylvalstr.charAt(1) == '?')) 973 { 974 yyless(1); 975 returnc(lexer_charAt(yylvalstr,0)); 976 } 977 else if ( (nchars >= 2) && (yylvalstr.charAt(0) == '@')) 978 { 979 yyless(1); 980 returnc(lexer_charAt(yylvalstr,0)); 981 } 982 else if ( (nchars >= 2) && (yylvalstr.charAt(0)== '|') && (yylvalstr.charAt(1) == '|')) 983 { //||--sss ,just get || only 984 yyless(2); 985 yylvalstr = yylvalstr.substring(0,2); 986 returni(concatenationop); 987 } 988 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '!') && (yylvalstr.charAt(1) == '=')) 989 { 990 yyless(2); 991 yylvalstr = yylvalstr.substring(0,2); 992 returni(cmpop); 993 } 994 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '>') && (yylvalstr.charAt(1) == '=')) 995 { 996 yyless(2); 997 yylvalstr = yylvalstr.substring(0,2); 998 returni(cmpop); 999 } 1000 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '=')) 1001 { 1002 yyless(2); 1003 yylvalstr = yylvalstr.substring(0,2); 1004 returni(cmpop); 1005 } 1006 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '<') && (yylvalstr.charAt(1) == '>')) 1007 { 1008 yyless(2); 1009 yylvalstr = yylvalstr.substring(0,2); 1010 returni(cmpop); 1011 } 1012 else if ( (nchars > 2) && (yylvalstr.charAt(0)== '.') && (yylvalstr.charAt(1) == '.')) 1013 { 1014 yyless(2); 1015 yylvalstr = yylvalstr.substring(0,2); 1016 returni(op); 1017 } 1018 else if (((nchars > 2) && (yylvalstr.charAt(0) == '*')) 1019 && (yylvalstr.charAt(1) == '/') 1020 && (getyysstate() == xc) 1021 ) 1022 { //in comment, and find */ , then it must the end of comment 1023 yyless(2); 1024 addlit(yylvalstr,yytextlen); 1025 if (xcdepth <= 0) 1026 { 1027 start(init); 1028 yylvalstr = litbufdup(); 1029 returni(cmtslashstar); 1030 } 1031 else 1032 xcdepth--; 1033 } 1034 else 1035 returni(op); 1036 } 1037 1038 break; 1039 } 1040 1041 case 28: 1042 1043 { 1044 returni(iconst); 1045 break; 1046 } 1047 1048 case 29: 1049 1050 { 1051 ///* for i in 1..5 loop, we can't recognize 1. as a decimal,but 1 as decimal 1052 nchars = yytextlen; 1053 if (yylvalstr.charAt(nchars-1) == '.') 1054 { 1055 dummych1 = get_char(); 1056 unget_char(dummych1); 1057 if (dummych1 == '.') 1058 { 1059 yyless(nchars-1); 1060 yylvalstr = yylvalstr.substring(0,nchars - 1); 1061 returni (iconst); 1062 return;//exit; 1063 } 1064 } 1065 returni (fconst); 1066 break; 1067 } 1068 1069 case 30: 1070 1071 { 1072 returni (fconst); 1073 break; 1074 } 1075 1076 case 31: 1077 1078 { 1079 int rw; 1080 if ( (rw = iskeyword(yylvalstr)) != -1) { returni(rw);} 1081 else 1082 {returni(ident);} 1083 break; 1084 } 1085 1086 case 32: 1087 1088 { 1089 returni (outer_join); 1090 break; 1091 } 1092 1093 1094 case 33: 1095 1096 { 1097 returni (k_clause); 1098 break; 1099 } 1100 1101 case 34: 1102 1103 { 1104 returni (m_clause); 1105 break; 1106 } 1107 1108 1109 case 35: 1110 1111 { 1112 returni (bind_v); 1113 break; 1114 } 1115 1116 case 36: 1117 1118 { 1119 if ((getyysstate() == xq) 1120 || (getyysstate() == xd) 1121 || (getyysstate() == xc) 1122 ) 1123 { 1124 addlit(yylvalstr, 1); 1125 yyless(1); 1126 return;//exit; 1127 } 1128 returni (ident); 1129 break; 1130 } 1131 1132 case 37: 1133 1134 { 1135 returni (error); 1136 break; 1137 } 1138 1139 default:{ 1140 System.out.println("fatal error in yyaction"); 1141 } 1142 }//switch 1143}/*yyaction*/; 1144 1145 1146 1147 }