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