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