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