home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / pars_rx.cpp < prev    next >
C/C++ Source or Header  |  2000-12-13  |  4KB  |  183 lines

  1. /*
  2. ** Module   :PARS_RX.CPP
  3. ** Abstract :
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Thu  09/04/1998 Created
  8. **
  9. */
  10.  
  11. #include <parser.h>
  12. #include <version.h>
  13.  
  14. //----------------------------------------------------------------------
  15. //
  16. // Class Parser_REXX
  17. //
  18. //----------------------------------------------------------------------
  19.  
  20. int Parser_REXX::next_token()
  21. {
  22.     old_tok = tok;
  23.     tok_len = 0;
  24.     color = CL_DEFAULT;
  25.     char *tmp = tok;
  26.  
  27.     int q_chr = (state == ST_QUOTE1) ? '"': ((state == ST_QUOTE2) ? '\'':0);
  28.  
  29.     if(state >= ST_COMMENT)
  30.     {
  31.         while(*tmp)
  32.         {
  33.             if(*tmp == '*' && *(tmp+1) == '/')
  34.             {
  35.                 tmp += 2;
  36.                 state = ST_INITIAL;
  37.                 break;
  38.             }
  39.             tmp++;
  40.         }
  41.         color = CL_COMMENT;
  42.  
  43.         if(state < ST_COMMENT)
  44.             state = ST_INITIAL;
  45.  
  46.         return (tok_len = (tmp - tok));
  47.     }
  48.  
  49.     if(state == ST_QUOTE1 || state == ST_QUOTE2)
  50.     {
  51.         while(*tmp)
  52.         {
  53.             if(*tmp == q_chr)
  54.             {
  55.                 tmp++;
  56.                 state = ST_INITIAL;
  57.                 break;
  58.             }
  59.             tmp++;
  60.         }
  61.         color = CL_CONST;
  62.         return (tok_len = (tmp - tok));
  63.     }
  64.  
  65.     switch(*tmp)
  66.     {
  67.         case ' ':
  68.         case '\t':
  69.             for(++tmp; __issp(*tmp);)
  70.                 tmp++;
  71.             return (tok_len = (tmp - tok));
  72.  
  73.         case '"':
  74.         case '\'':
  75.             q_chr = *tmp;
  76.  
  77.             state = (q_chr == '"') ? ST_QUOTE1:ST_QUOTE2;
  78.             ++tmp;
  79.             color = CL_CONST;
  80.             return (tok_len = (tmp - tok));
  81.  
  82.         case '/':
  83.             if(tok[1] == '*')
  84.             {
  85.                 tmp += 2;
  86.  
  87.                 state = ST_COMMENT;
  88.  
  89.                 while(*tmp)
  90.                 {
  91.                     if(*tmp == '*' && *(tmp + 1) == '/')
  92.                     {
  93.                         tmp += 2;
  94.                         state--;
  95.                         break;
  96.                     }
  97.                     tmp++;
  98.                 }
  99.                 color = CL_COMMENT;
  100.  
  101.                 if(state < ST_COMMENT)
  102.                     state = ST_INITIAL;
  103.  
  104.                 return (tok_len = (tmp - tok));
  105.             }
  106.             break;
  107.  
  108.         case ';':
  109.             color = CL_SEMICOL;
  110.             break;
  111.  
  112.         case '0':
  113.         case '1':
  114.         case '2':
  115.         case '3':
  116.         case '4':
  117.         case '5':
  118.         case '6':
  119.         case '7':
  120.         case '8':
  121.         case '9':
  122.  
  123.             while(__ishd(*tmp))
  124.                 tmp++;
  125.  
  126.             if(color == CL_DEFAULT)
  127.                 color = CL_NUMBER;
  128.             return (tok_len = (tmp - tok));
  129.  
  130.         case '~':
  131.             tmp++;
  132.             color = CL_IDENT;
  133.             return (tok_len = (tmp - tok));
  134.  
  135.         case ':':
  136.             if(tmp[1] != ':')
  137.                 break;
  138.  
  139.             tmp += 2;
  140.  
  141.             if(!__isis(*tmp) || !*tmp)
  142.             {
  143.                 color = CL_IDENT;
  144.                 return tok_len = (tmp - tok);
  145.             }
  146.  
  147.         default:
  148.             if(__isis(*tmp))
  149.             {
  150.                 for(++tmp;__isic(*tmp);)
  151.                 {
  152.                     tmp++;
  153.  
  154.                     if(*tmp == '~')
  155.                     {
  156.                         tmp++;
  157.                         color = CL_FUNCTION;
  158.                     }
  159.                 }
  160.  
  161.                 tok_len = (tmp - tok);
  162.  
  163.                 if(color != CL_DEFAULT)
  164.                     return tok_len;
  165.  
  166.                 if(is_kwd())
  167.                 {
  168.                     color = CL_STDWORD;
  169.                     return tok_len;
  170.                 }
  171.  
  172.                 if(*tmp && (*tmp == '(' || *tmp == ':'))
  173.                     color = CL_FUNCTION;
  174.                 else
  175.                     color = CL_IDENT;
  176.                 return tok_len;
  177.             }
  178.     }
  179.     return (tok_len = 1);
  180. }
  181.  
  182.  
  183.