home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / macabuse / src / parse.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-05-20  |  3.1 KB  |  154 lines

  1. #include "parse.hpp"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. char *ttype[]={"END","NUMBER","STRING","WORD","OPERATOR","LEFT BRACE","RIGHT BRACE",
  7.             "LEFT PAREN","RIGHT_PAREN","ASSIGNMENT","COMMA"};
  8.  
  9. void match_right(char *&s)
  10. {
  11.   while (1)
  12.   {    
  13.     switch (token_type(s))
  14.     {
  15.       case sLEFT_PAREN : next_token(s); match_right(s); break;
  16.       case sRIGHT_PAREN : next_token(s); return ; break;
  17.       default :
  18.         next_token(s);           
  19.     }
  20.   }   
  21. }
  22.  
  23.  
  24. void expect(int thing, int type, char *where)
  25. {
  26.   if (thing!=type)
  27.   {
  28.     printf("Expecting %s (not %s) at %s\n",ttype[type],ttype[thing],where);
  29.     exit(1);
  30.   }  
  31. }
  32.   
  33.  
  34. int token_type(char *s);
  35.  
  36.  
  37. void skip_space(char *&s)
  38. {
  39.   while (*s && (*s==' ' || *s=='\n' || *s=='\t' || *s=='\r')) s++;
  40.   
  41.   if (*s=='/' && s[1]=='*')
  42.   {
  43.     s+=2;
  44.     while (*s && (*s!='*' || s[1]!='/')) s++;
  45.     s+=2;
  46.     skip_space(s);    
  47.   }    
  48. }
  49.  
  50.  
  51. int get_token(char *&s, char *buffer)  // returns token type
  52. {
  53.   // skip any starting spaces
  54.   skip_space(s);
  55.  
  56.   switch (*s)
  57.   {
  58.     case 0    : *buffer=0; return sEND;                                  break;    
  59.     case '{'  : *(buffer++)=*(s++); *buffer=0; return sLEFT_BRACE;       break;      
  60.     case '}'  : *(buffer++)=*(s++); *buffer=0; return sRIGHT_BRACE;      break;
  61.     case '('  : *(buffer++)=*(s++); *buffer=0; return sLEFT_PAREN;       break;
  62.     case ')'  : *(buffer++)=*(s++); *buffer=0; return sRIGHT_PAREN;      break;
  63.     case '='  : *(buffer++)=*(s++); *buffer=0; return sASSIGNMENT;       break;
  64.     case ','  : *(buffer++)=*(s++); *buffer=0; return sCOMMA;            break;
  65.     case '+' :
  66.     case '-' :
  67.     case '*' :          
  68.     case '/' : *(buffer++)=*(s++); *buffer=0; return sOPERATOR;          break;
  69.     default :
  70.     {          
  71.       if (isdigit(*s))
  72.       {
  73.     while (isdigit(*s))
  74.     *(buffer++)=*(s++);
  75.     *buffer=0;    
  76.     return sNUMBER;    
  77.       } else if (*s=='"')
  78.       {
  79.     while (*s=='"')
  80.     {      
  81.       s++;    
  82.       while (*s && *s!='"')
  83.         *(buffer++)=*(s++);
  84.          if (*s) s++;
  85.       skip_space(s);
  86.     }
  87.     *buffer=0;    
  88.     return sSTRING;    
  89.       } else
  90.       {
  91.     *(buffer++)=*(s++);      // take the first character, no matter what it is
  92.                              // because nobody else will     
  93.     while (*s && isalnum(*s) || *s=='_' || *s=='.')
  94.     *(buffer++)=*(s++);
  95.     *buffer=0;
  96.     return sWORD;    
  97.       }
  98.     }
  99.   }  
  100. }  
  101.  
  102.  
  103. int token_type(char *s)
  104. {
  105.   char tmp[100];
  106.   return get_token(s,tmp);  
  107. }
  108.  
  109.  
  110. void next_token(char *&s)
  111. {
  112.   char tmp[100];
  113.   get_token(s,tmp);  
  114. }
  115.  
  116. int get_number(char *&s)
  117. {
  118.   char tmp[100];
  119.     
  120.   if (get_token(s,tmp)==sOPERATOR) 
  121.   {
  122.     if (tmp[0]=='-')    
  123.     {
  124.       expect(get_token(s,tmp),sNUMBER,s);     
  125.       return -atoi(tmp);
  126.     }
  127.     else expect(sWORD,sNUMBER,s);
  128.   }
  129.   return atoi(tmp);
  130. }
  131.  
  132.  
  133. void get_filename(char *&s, char *buffer)
  134. {
  135.   char *b=buffer;
  136.   skip_space(s);
  137.   while (*s && *s!=' ' && *s!='\n' && *s!='\t' && *s!='\r' && *s!=')' && *s!='(')
  138.     *(b++)=*(s++);
  139.   *b=0;
  140. }
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.