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        }