Annotation of OpenXM/src/kan96xx/Kan/parserpass0.c, Revision 1.1.1.1
1.1 maekawa 1: /* parserpass0.c */
2: /* In this preprocessor, for example, the expression
3: x^2+y^2-4+x y;
4: is transformed into
5: x3^2+x4^2-4+x3*x4;
6: */
7: /* 1992/03/05 */
8: #include <stdio.h>
9: #include "datatype.h"
10: #include "extern2.h"
11:
12: static int isSymbol0();
13: static int isNumber0();
14: typedef enum {INIT,GET,PUT} actionType;
15:
16: struct tokens{
17: char *token;
18: int kind;
19: };
20:
21: #define KAZU 1 /* used in kind of tokens */
22: #define ID 2
23:
24: #define BUF0LIMIT 2000
25: #define STRBUFMAX 20000
26: static char *String0;
27: static int Strp0 = 0;
28: static char Buf0org[BUF0LIMIT];
29: static char *Buf0 = Buf0org ;
30: static int Buf0limit = BUF0LIMIT ;
31: static int Exist0 = 0;
32:
33: static struct tokens getoken_pass0();
34: static struct tokens flush();
35:
36:
37: static int get0()
38: /* get a letter from String0 */
39: {
40: int c;
41: c = String0[Strp0++];
42: if (c == '\0') {
43: Strp0--;return(EOF);
44: } else return(c);
45: }
46:
47: static put0(c)
48: int c;
49: /* put a letter on Buf0 */
50: {
51: char *new; int i;
52: Buf0[Exist0++] = c;
53: if (Exist0 >= Buf0limit-1) {
54: new = (char *) sGC_malloc(sizeof(char *)*Buf0limit*2) ;
55: if (new == (char *)NULL) {
56: fprintf(stderr,"No more memory in parserpass0.c\n");
57: exit(18);
58: }
59: fprintf(stderr,"\nSystem Message: Increasing Buf0 to %d in parserpass0.c\n",Buf0limit*2);
60: for (i=0; i<Buf0limit; i++) {
61: new[i] = Buf0[i];
62: }
63: Buf0 = new; Buf0limit *= 2;
64: }
65: }
66:
67: static struct tokens flush()
68: {
69: char *token;
70: struct tokens r;
71: if (Exist0<=0) {
72: fprintf(stderr,"\n flush() is called without data. \n");
73: r.token = (char *)NULL; r.kind = -1;
74: return(r);
75: }
76: Buf0[Exist0] = '\0';
77: Exist0 = 0;
78: token = (char *)sGC_malloc((strlen(Buf0)+1)*sizeof(char));
79: strcpy(token,Buf0);
80: r.token = token;
81: if (isSymbol0(token[0])) r.kind = token[0];
82: else if (isNumber0(token[0])) r.kind =KAZU;
83: else r.kind = ID;
84: return(r);
85: }
86:
87: static isSpace0(c)
88: int c;
89: {
90: if (c <= ' ') return(1);
91: else return(0);
92: }
93:
94: static int isSymbol0(c)
95: int c;
96: {
97: if ((c == '+') ||
98: (c == '-') ||
99: (c == '*') ||
100: (c == '/') ||
101: (c == '^') ||
102: (c == ';') ||
103: (c == '(') ||
104: (c == ')'))
105: return(1);
106: else return(0);
107: }
108:
109: static int isNumber0(c)
110: int c;
111: {
112: if ((c>='0') && (c<='9')) return(1);
113: else return(0);
114: }
115:
116: static struct tokens getoken_pass0(kind)
117: actionType kind;
118: {
119: static int c;
120: static struct tokens rnull;
121: if (kind == INIT) {
122: Strp0 = 0;
123: Exist0 = 0;
124: c = get0();
125: rnull.token = (char *)NULL; rnull.kind = -1;
126: return(rnull);
127: }
128:
129: for (;;) {
130: if (c == EOF) {
131: if (Exist0) return(flush());
132: else return(rnull);
133: } else if (isSpace0(c)) {
134: if (Exist0) {
135: c = get0(); return(flush());
136: }else {
137: while (isSpace0(c=get0())) ;
138: }
139: } else if (isSymbol0(c)) {
140: if (Exist0) return(flush());
141: else {
142: put0(c);
143: c = get0();
144: return(flush());
145: }
146: } else if (isNumber0(c)) {
147: put0(c);
148: c = get0();
149: while (isNumber0(c)) {
150: put0(c);
151: c = get0();
152: }
153: return(flush());
154: } else { /* identifier */
155: put0(c);
156: c =get0();
157: while ((!isSymbol0(c)) &&
158: (!isSpace0(c)) &&
159: (c != EOF)) {
160: put0(c);
161: c = get0();
162: }
163: return(flush());
164: }
165: }
166: }
167:
168: /* This function put the string into the Buf */
169: static char Buftmp[STRBUFMAX];
170: static char *Buf = Buftmp;
171: static int Buflimit = STRBUFMAX;
172:
173: static putstr(str,kind)
174: char str[]; /* string to be outputted */
175: actionType kind; /* kind is INIT or PUT */
176: {
177: static int ptr;
178: int i;
179: int k; char *newbuf;
180: if (kind == INIT) {
181: ptr = 0;
182: return;
183: }
184:
185: i=0;
186: while (str[i]!='\0') {
187: Buf[ptr++] = str[i++];
188: Buf[ptr] = '\0';
189: if (ptr >= Buflimit-2) {
190: fprintf(stderr,"\nSystem Message: Limit is exceeded in putstr() (parserpass0.c) \n");
191: fprintf(stderr,"Increasing Buf to %d.\n",2*Buflimit);
192: newbuf = (char *) sGC_malloc(2*Buflimit);
193: if (newbuf == (char *)NULL) {
194: fprintf(stderr,"\nNo memory in putstr() in parserpass0.c\n");
195: exit(20);
196: }
197: for (k=0; k<Buflimit; k++) {
198: newbuf[k] = Buf[k];
199: }
200: Buf = newbuf;
201: Buflimit *= 2;
202: }
203: }
204: }
205:
206:
207:
208: char *str2strPass0(string,ringp)
209: char *string;
210: struct ring *ringp;
211: {
212:
213: struct tokens ptoken; /* previous token */
214: struct tokens ctoken; /* current token */
215: struct tokens nulltoken;
216: char *result;
217: int i;
218: char work[100];
219: int inputTranslation = 1;
220: int n;
221:
222: n = ringp->n;
223:
224: nulltoken.token = (char *)NULL;
225: nulltoken.kind = -1;
226: putstr("",INIT);
227: String0 = (char *)sGC_malloc((strlen(string)+2)*sizeof(char));
228: strcpy(String0,string);
229: getoken_pass0(INIT);
230:
231: ptoken = nulltoken;
232: for (;;) {
233: ctoken = getoken_pass0(GET);
234:
235: /* ** ----> ^ */
236: if (ctoken.kind == '*' && ptoken.kind == '*') {
237: ptoken.kind = '^';
238: ptoken.token = (char *)sGC_malloc(sizeof(char)*5);
239: strcpy(ptoken.token,"^");
240: ctoken = getoken_pass0(GET);
241: }
242:
243: if (ctoken.token == (char *)NULL) {
244: fprintf(stderr,"\n Unexpected eof in str2strPass0() (parserpass0.c). ; is expected. \n");
245: return((char *)NULL);
246: }
247: /* output the ptoken.token */
248: if (inputTranslation && (ptoken.kind == ID)) {
249: /* Do the input translation for identifier*/
250: for (i=0; i<n; i++) {
251: if (strcmp(ptoken.token,ringp->x[i]) == 0) {
252: sprintf(work,"x%d",i);
253: putstr(work,PUT);
254: i = -1;
255: break; /* break for */
256: }
257: if (strcmp(ptoken.token,ringp->D[i]) == 0) {
258: sprintf(work,"d%d",i);
259: putstr(work,PUT);
260: i = -1;
261: break; /* break for */
262: }
263: }
264: if (strlen(ptoken.token)>0 && (ptoken.token)[0] == '@') {
265: putstr(ptoken.token,PUT);
266: i = -1;
267: }
268: if (i != -1) { /* very dirty code */
269: fprintf(stderr,"\n Undefined identifier %s. \n",ptoken.token);
270: putstr(ptoken.token,PUT);
271: }
272: /* end of input translations */
273: }else {
274: if (ptoken.token != (char *)NULL) {
275: putstr(ptoken.token,PUT);
276: }
277: }
278: /* if ctoken.token is ";" then end */
279: if (strcmp(ctoken.token,";") == 0) {
280: putstr(ctoken.token,PUT);
281: if (ptoken.token != (char *)NULL) sGC_free(ptoken.token);
282: if (ctoken.token != (char *)NULL) sGC_free(ctoken.token);
283: result = (char *)sGC_malloc((strlen(Buf)+2)*sizeof(char));
284: strcpy(result,Buf);
285: return(result);
286: }
287:
288: if (((ptoken.kind == ID) || (ptoken.kind == KAZU) || (ptoken.kind == ')'))
289: &&
290: ((ctoken.kind == ID) || (ctoken.kind == KAZU) || (ctoken.kind == '(')))
291: {
292: putstr(" * ",PUT);
293: }
294: if (ptoken.token != (char *)NULL) sGC_free(ptoken.token);
295: ptoken = ctoken;
296: }
297: }
298:
299:
300:
301: /*
302: main() {
303: char str[200];
304: struct ring r;
305: static char *x[]={"x","y","z"};
306: static char *D[]={"Dx","Dy","Dz"};
307: r.n = 3;
308: r.x = x; r.D = D;
309: gets(str);
310: printf("%s\n",str2strPass0(str,&r));
311: }
312: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>