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