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