home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ctb_291.zip / source / tstream.cpp < prev   
C/C++ Source or Header  |  1996-08-14  |  3KB  |  165 lines

  1. /*
  2. ** Module   :TSTREAM.CPP
  3. ** Abstract :Token stream implementation
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. ** Log:
  7. ** Last update Sat  11-05-96
  8. */
  9.  
  10. #include <dlc.h>
  11.  
  12. File OUT;
  13. Table NT;
  14. Table DEFS;
  15. Table INCLUDES;
  16.  
  17. TokenStream::TokenStream():File()
  18. {
  19.     lastchar = ' ';
  20.     rec.str  = 0;
  21.     token    = 0;
  22.     line_num = 1;
  23. }
  24. TokenStream::TokenStream(char *name, char *def):File(name, def, RD)
  25. {
  26.     lastchar = ok() ? get() : EOFILE;
  27.     token = new char[1024];
  28.     memset(token, 0, 1024);
  29.     rec.str = token;
  30.     line_num = 1;
  31. }
  32. int TokenStream::open(char *name, char *def)
  33. {
  34.     if (!token)
  35.     {
  36.         token = new char[1024];
  37.         if (!token)
  38.             return -1;
  39.         rec.str = token;
  40.         memset(token, 0, 1024);
  41.     }
  42.     line_num = 1;
  43.     return File::open(name, def, RD);
  44. }
  45.  
  46. /*
  47. ** id        ::= aplha[a_d_delim]
  48. ** a_d_delim ::= alpha|digit|delim
  49. ** alpha     ::= isaplha(ch)
  50. ** digit     ::= isdigit(ch)
  51. ** delim     ::= '$'|'@'|'_'|'.' ;
  52. ** string    ::= 'any_char' | "any_char"
  53. ** comment   ::= //any_char
  54. ** any_char  ::= ch > 0x20 & ch != "'" | '"'
  55. */
  56.  
  57. int TokenStream::get_char_token()
  58. {
  59.     char *tok = token;
  60.     int trm;
  61.  
  62.     if (!tok)
  63.         lastchar = EOFILE;
  64.     if (lastchar == EOFILE)
  65.         return _eof;
  66.     while (isspace(lastchar) || lastchar == '\r' || lastchar == '\n')
  67.     {
  68.         if (lastchar == '\r')
  69.             line_num++;
  70.         lastchar = get();
  71.         if (lastchar == EOFILE)
  72.             return _eof;
  73.     }
  74.     if (isalpha(lastchar) || lastchar == '_')
  75.     {
  76.         do
  77.         {
  78.             *tok++ = lastchar;
  79.             lastchar = get();
  80.         }
  81.         while (isalpha(lastchar) || isdigit(lastchar) || lastchar == '_' || lastchar == '.' && lastchar != EOFILE);
  82.         *tok = 0;
  83.         return _ident;
  84.     }
  85.     if (isdigit(lastchar))
  86.     {
  87.         trm = 0;
  88.         do
  89.         {
  90.             *tok++ = lastchar;
  91.             if (lastchar == '.')
  92.                 if (trm)
  93.                     break;
  94.                 else
  95.                     trm = 1;
  96.             lastchar = get();
  97.         }
  98.         while (isdigit(lastchar) || lastchar == '.' && lastchar != EOFILE);
  99.         *tok = 0;
  100.         return (trm) ? _float : _digit;
  101.     }
  102.     if (lastchar == '/')
  103.     {
  104.         lastchar = get();
  105.         if (lastchar == '/')
  106.         {
  107.             while (lastchar != '\r' && lastchar > 0)
  108.                 lastchar = get();
  109.             return get_char_token();
  110.         }
  111.         if (lastchar == '*')
  112.         {
  113.             lastchar = get();
  114.             do
  115.             {
  116.                 trm = lastchar;
  117.                 lastchar = get();
  118.                 if (lastchar == '\r')
  119.                     line_num++;
  120.             }
  121.             while ((lastchar != '/' || trm != '*') && lastchar != EOFILE);
  122.             if (lastchar == EOFILE)
  123.                 return _eof;
  124.             lastchar = get();
  125.             return get_char_token();
  126.         }
  127.         *tok++ = '/';
  128.         *tok = 0;
  129.         return _other;
  130.     }
  131.     if (lastchar == '"' || lastchar == '\'')
  132.     {
  133.         trm = lastchar;
  134.         do
  135.         {
  136.             lastchar = get();
  137.             if (lastchar == '\\')
  138.             {
  139.                 lastchar = get();
  140.                 if (lastchar == '\r' || lastchar == '\n')
  141.                     continue;
  142.                 else
  143.                     *tok++ = '\\';
  144.             }
  145.             if (lastchar == trm || lastchar < 0)
  146.                 break;
  147.             *tok++ = lastchar;
  148.         }
  149.         while (lastchar != '\r');
  150.         *tok = 0;
  151.         if (lastchar == EOFILE)
  152.             return _eof;
  153.         if (lastchar == '\r')
  154.             return _badconst;
  155.         lastchar = get();
  156.         return _const;
  157.     }
  158.     if (lastchar == EOFILE)
  159.         return _eof;
  160.     *tok++ = lastchar;
  161.     lastchar = get();
  162.     *tok = 0;
  163.     return _other;
  164. }
  165.