source: abuse/tags/pd/macabuse/src/parse.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 11 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 2.9 KB
Line 
1#include "parse.hpp"
2#include <stdio.h>
3#include <stdlib.h>
4#include <ctype.h>
5
6char *ttype[]={"END","NUMBER","STRING","WORD","OPERATOR","LEFT BRACE","RIGHT BRACE",
7                "LEFT PAREN","RIGHT_PAREN","ASSIGNMENT","COMMA"};
8
9void 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
24void 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
34int token_type(char *s);
35
36
37void 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
51int 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
103int token_type(char *s)
104{
105  char tmp[100];
106  return get_token(s,tmp); 
107}
108
109
110void next_token(char *&s)
111{
112  char tmp[100];
113  get_token(s,tmp); 
114}
115
116int 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
133void 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
Note: See TracBrowser for help on using the repository browser.