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