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