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

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