Annotation of OpenXM/src/kan96xx/Kan/scanner2.c, Revision 1.1.1.1
1.1 maekawa 1: /* scanner2.c (SM StackMachine) */
2: /* export: struct tokens decompostToTokens(char *str,int *sizep);
3: scanner2.c is for getting tokens from a string.
4: */
5: #include <stdio.h>
6: #include "datatype.h"
7: #include "stackm.h"
8: struct tokens lookupTokens(struct tokens t);
9: int isLiteral(char *s);
10: struct object lookupLiteralString(char *s);
11: /**************** defined in stackm.h ****************************
12: typedef enum {INIT,GET,PUT,OPEN} actionType;
13:
14: struct tokens{
15: char *token;
16: int kind;
17: };
18:
19:
20: #define ID 2
21: #define DOLLAR 3 strings enclosed by dollar sign
22: #define EXECUTABLE_STRING 4 strings enclosed by {}
23: #define EXECUTABLE_ARRAY 8 Don't set it in this file.
24: ******************************************************************/
25:
26:
27: /******* declaration-part of lexical analizer ********************/
28: #define mygetchar() getSM()
29: /* to use getSM() ( input from StringSM ),
30: setup StringSM;
31: getokenSM(INIT);
32: */
33:
34:
35:
36:
37: #define BUF0LIMIT 40000
38: static char *StringSM;
39: static int StrpSM = 0;
40: static char BufSMorg[BUF0LIMIT];
41: static char *BufSM = BufSMorg;
42: static int Buf0limit = BUF0LIMIT ;
43: static int ExistSM = 0;
44: static int TypeSM = ID;
45:
46: /**************** end of declaration part of lexical analizer ******/
47:
48: static int getSM();
49: static putSM();
50: static struct tokens flushSM();
51: static isSpaceSM();
52: static isDollarSM();
53: static isBraceSM();
54: static isKakkoSM();
55: static isSymbolSM();
56: static struct tokens getokenSM2();
57:
58: /**************** code part of lexical analizer ********************/
59:
60: struct tokens *decomposeToTokens(str,sizep)
61: char *str;
62: int *sizep;
63: {
64: struct tokens *tArray;
65: struct tokens token;
66: int k;
67: int size;
68:
69: StringSM = (char *) sGC_malloc((strlen(str)+3)*sizeof(char));
70: if (StringSM == (char *)NULL) {
71: errorScanner2("I have no memormy.");
72: }
73: strcpy(StringSM,str);
74: getokenSM2(INIT);
75: size = 0;
76: token = getokenSM2(GET);
77: while (token.kind != -1) {
78: size++;
79: token = getokenSM2(GET);
80: }
81:
82: tArray = (struct tokens *)sGC_malloc((size+1)*sizeof(struct tokens));
83: strcpy(StringSM,str);
84: getokenSM2(INIT);
85: for (k=0; k<size; k++) {
86: tArray[k] = getokenSM2(GET);
87: }
88:
89: *sizep = size;
90: return(tArray);
91: }
92:
93:
94:
95: static int getSM()
96: /* get a letter from StringSM */
97: {
98: int c;
99: c = StringSM[StrpSM++];
100: if (c == '\0') {
101: StrpSM--;return(EOF);
102: } else return(c);
103: }
104:
105: static putSM(c)
106: int c;
107: /* put a letter on BufSM */
108: {
109: char *new; int i;
110: BufSM[ExistSM++] = ((c=='\n')? ' ' : c);
111: if (ExistSM >= Buf0limit-1) {
112: new = (char *) sGC_malloc(sizeof(char *)*Buf0limit*2) ;
113: if (new == (char *)NULL) {
114: fprintf(stderr,"No more memory in parserpass0.c\n");
115: exit(18);
116: }
117: fprintf(stderr,"\nSystem Message: Increasing BufSM to %d in scanner2.c\n",Buf0limit*2);
118: for (i=0; i<Buf0limit; i++) {
119: new[i] = BufSM[i];
120: }
121: BufSM = new; Buf0limit *= 2;
122: }
123: }
124:
125: static struct tokens flushSM()
126: {
127: char *token;
128: struct tokens r;
129: if (ExistSM<=0) {
130: fprintf(stderr,"\n flushSM() is called without data. Don't use the empty string $$. \n");
131: r.token = (char *)NULL; r.kind = -10; /* -1 ==> -10 ***/
132: return(r);
133: }
134: BufSM[ExistSM] = '\0';
135: ExistSM = 0;
136: token = (char *)sGC_malloc((strlen(BufSM)+1)*sizeof(char));
137: strcpy(token,BufSM);
138: r.token = token;
139: r.kind = TypeSM;
140: if (r.kind == ID) {
141: if (isLiteral(r.token)) {
142: r.object = lookupLiteralString(r.token);
143: }else{
144: r = lookupTokens(r); /* Compute hashing values */
145: }
146: }
147: return(r);
148: }
149:
150: static isSpaceSM(c)
151: int c;
152: {
153: if ((c <= ' ') && (c!= EOF)) return(1);
154: else return(0);
155: }
156:
157: static isDollarSM(c)
158: int c;
159: {
160: if (c == '$') return(1);
161: else return(0);
162: }
163:
164: static isBraceSM(c)
165: int c;
166: {
167: if (c == '{') return(1);
168: else return(0);
169: }
170:
171: static isKakkoSM(c)
172: int c;
173: {
174: if (c == '(') return(1);
175: else return(0);
176: }
177:
178: static isSymbolSM(c)
179: int c;
180: {
181: if ((c == '{') ||
182: (c == '}') ||
183: (c == '[') ||
184: (c == ']') ||
185: (c == '(') ||
186: (c == ')'))
187: return(1);
188: else return(0);
189: }
190:
191: static struct tokens getokenSM2(kind,str)
192: actionType kind;
193: char *str;
194: {
195: static int c;
196: static struct tokens rnull;
197: int level;
198:
199: if (kind == INIT) {
200: StrpSM = 0;
201: ExistSM = 0;
202:
203: c = mygetchar();
204: rnull.token = (char *)NULL; rnull.kind = -1;
205: return(rnull);
206: }
207:
208:
209:
210: for (;;) {
211: TypeSM = ID;
212: if (c == EOF) {
213: if (ExistSM) return(flushSM());
214: else return(rnull);
215: } else if (isSpaceSM(c)) {
216: if (ExistSM) {
217: c = mygetchar(); return(flushSM());
218: }else {
219: while (isSpaceSM(c=mygetchar())) ;
220: }
221: } else if (isDollarSM(c)) { /* output contents in dollar signs. */
222: if (ExistSM) return(flushSM());
223: else {
224: c = mygetchar();
225: while ((c != EOF) && (c != '$')) {
226: putSM(c);
227: c = mygetchar();
228: }
229: if (c=='$') c=mygetchar();
230: TypeSM = DOLLAR;
231: return(flushSM());
232: }
233: } else if (isBraceSM(c)) { /* output contents in { } */
234: /* { { } } */
235: level = 0;
236: if (ExistSM) return(flushSM());
237: else {
238: c = mygetchar();
239: while (1) {
240: if (c == '%') { /* skip the comment in the brace. */
241: while (((c=mygetchar()) != '\n') && (c != EOF)) ;
242: }
243: if (c == EOF) break;
244: if ((c == '}') && (level <= 0)) break;
245: if ( c == '{') ++level;
246: if ( c == '}') --level;
247: putSM(c);
248: c = mygetchar();
249: }
250: if (c=='}') c=mygetchar();
251: TypeSM = EXECUTABLE_STRING;
252: return(flushSM());
253: }
254: } else if (isKakkoSM(c)) { /* output contents in ( ) */
255: level = 0;
256: if (ExistSM) return(flushSM());
257: else {
258: c = mygetchar();
259: while (1) {
260: if (c == EOF) break;
261: if (c == '\\') { /* e.g. \( */
262: putSM(c);
263: c = mygetchar();
264: if (c == EOF) break;
265: }else{
266: if ((c == ')') && (level <= 0)) break;
267: if ( c == '(') ++level;
268: if ( c == ')') --level;
269: }
270: putSM(c);
271: c = mygetchar();
272: }
273: if (c==')') c=mygetchar();
274: TypeSM = DOLLAR;
275: return(flushSM());
276: }
277: } else if (c=='%') { /* comment */
278: while (((c=mygetchar()) != '\n') && (c != EOF)) ;
279: if(ExistSM) return(flushSM());
280: } else if (isSymbolSM(c)) { /* symbols. {,} etc */
281: if(ExistSM) return(flushSM());
282: else {
283: putSM(c);
284: c = mygetchar();
285: return(flushSM());
286: }
287: } else { /* identifier */
288: putSM(c);
289: c =mygetchar();
290: while ((!isDollarSM(c)) &&
291: (!isSpaceSM(c)) &&
292: (!isSymbolSM(c)) &&
293: (c != EOF)) {
294: putSM(c);
295: c = mygetchar();
296: }
297: return(flushSM());
298: }
299: }
300: }
301:
302: /*********** end of code part of lexical analizer ********************/
303:
304:
305: errorScanner2(str)
306: char *str;
307: {
308: fprintf(stderr,"Error (scanner2.c): %s\n",str);
309: exit(10);
310: }
311:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>