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