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