|
|
1.1 root 1: %term xxif 300 xxelse 301 xxwhile 302 xxrept 303 xxdo 304 xxrb 305 xxpred 306
2: %term xxident 307 xxle 308 xxge 309 xxne 310 xxnum 311 xxcom 312
3: %term xxstring 313 xxexplist 314 xxidpar 315 xxelseif 316 xxlb 318 xxend 319
4: %term xxcase 320 xxswitch 321 xxuntil 322 xxdefault 323
5: %term xxeq 324
6:
7: %left '|'
8: %left '&'
9: %left '!'
10: %binary '<' '>' xxeq xxne xxge xxle
11: %left '+' '-'
12: %left '*' '/'
13: %left xxuminus
14: %right '^'
15:
16: %{
17: #include "b.h"
18: #include <stdio.h>
19: %}
20:
21: %%
22: %{
23: struct node *t;
24: %}
25:
26:
27: allprog: prog xxnew
28: ;
29:
30: prog: stat
31: | prog stat
32: ;
33:
34: stat: iftok pred nlevel elsetok nlevel
35: | iftok pred nlevel
36: | xxtab whtok pred nlevel
37: | xxtab rpttok nlevel optuntil
38: | xxtab dotok nlevel
39: | xxtab swtok oppred pindent lbtok caseseq xxtab rbtok mindent
40: | xxtab fstok
41: | lbtok prog xxtab rbtok
42: | lbtok rbtok
43: | labtok stat
44: | xxnl comtok stat
45: | error
46: ;
47:
48:
49: xxtab: = {
50: if (!xxlablast) tab(xxindent);
51: xxlablast = 0;
52: }
53:
54: xxnl: = newline();
55: xxnew: = putout('\n',"\n");
56: nlevel: pindent stat mindent;
57: pindent: =
58: {
59: if (xxstack[xxstind] != xxlb)
60: ++xxindent;
61: };
62: mindent: =
63: {if (xxstack[xxstind] != xxlb && xxstack[xxstind] != xxelseif)
64: --xxindent;
65: pop();
66: };
67: caseseq: casetok caseseq
68: | casetok
69: ;
70:
71: casetok: xxtab xxctok predlist pindent prog mindent
72: | xxtab xxctok predlist pindent mindent
73: | xxtab deftok pindent prog mindent
74: | xxnl comtok casetok
75: ;
76:
77: xxctok: xxcase = {putout(xxcase,"case "); free ($1); push(xxcase); }
78:
79:
80: deftok: xxdefault ':' = {
81: putout(xxcase,"default");
82: free($1);
83: putout(':',":");
84: free($2);
85: push(xxcase);
86: }
87: swtok: xxswitch = {putout(xxswitch,"switch"); free($1); push(xxswitch); }
88:
89: fstok: xxend = {
90: free($1);
91: putout(xxident,"end");
92: putout('\n',"\n");
93: putout('\n',"\n");
94: putout('\n',"\n");
95: }
96: | xxident = {
97: putout(xxident,$1);
98: free($1);
99: newflag = 1;
100: forst();
101: newflag = 0;
102: };
103:
104:
105:
106: identtok: xxident '(' explist ')' = {
107: xxt = addroot($1,xxident,0,0);
108: $$ = addroot("",xxidpar,xxt,$3);
109: }
110:
111: | xxident = $$ = addroot($1,xxident,0,0);
112: ;
113:
114: predlist: explist ':' = {
115: yield($1,0);
116: putout(':',":");
117: freetree($1);
118: }
119: explist: expr ',' explist = $$ = addroot($2,xxexplist,checkneg($1,0),$3);
120: | expr = $$ = checkneg($1,0);
121: ;
122:
123:
124: oppred: pred
125: |
126: ;
127:
128: pred: '(' expr ')' = { t = checkneg($2,0);
129: yield(t,100); freetree(t); };
130:
131: expr: '(' expr ')' = $$ = $2;
132: | '-' expr %prec xxuminus = $$ = addroot($1,xxuminus,$2,0);
133: | '!' expr = $$ = addroot($1,'!',$2,0);
134: | expr '+' expr = $$ = addroot($2,'+',$1,$3);
135: | expr '-' expr = $$ = addroot($2,'-',$1,$3);
136: | expr '*' expr = $$ = addroot($2,'*',$1,$3);
137: | expr '/' expr = $$ = addroot($2,'/',$1,$3);
138: | expr '^' expr = $$ = addroot($2,'^',$1,$3);
139: | expr '|' expr = $$ = addroot($2,'|',$1,$3);
140: | expr '&' expr = $$ = addroot($2,'&',$1,$3);
141: | expr '>' expr = $$ = addroot($2,'>',$1,$3);
142: | expr '<' expr = $$ = addroot($2,'<',$1,$3);
143: | expr xxeq expr = $$ = addroot($2,xxeq,$1,$3);
144: | expr xxle expr = $$ = addroot($2,xxle,$1,$3);
145: | expr xxge expr = $$ = addroot($2,xxge,$1,$3);
146: | expr xxne expr = $$ = addroot($2,xxne,$1,$3);
147: | identtok = $$ = $1;
148: | xxnum = $$ = addroot($1,xxnum,0,0);
149: | xxstring = $$ = addroot($1,xxstring,0,0);
150: ;
151:
152: iftok: xxif =
153: {
154: if (xxstack[xxstind] == xxelse && !xxlablast)
155: {
156: --xxindent;
157: xxstack[xxstind] = xxelseif;
158: putout(' '," ");
159: }
160: else
161: {
162: if (!xxlablast)
163: tab(xxindent);
164: xxlablast = 0;
165: }
166: putout(xxif,"if");
167: free($1);
168: push(xxif);
169: }
170: elsetok: xxelse =
171: {
172: tab(xxindent);
173: putout(xxelse,"else");
174: free($1);
175: push(xxelse);
176: }
177: whtok: xxwhile = {
178: putout(xxwhile,"while");
179: free($1);
180: push(xxwhile);
181: }
182: rpttok: xxrept = {
183: putout(xxrept,"repeat");
184: free($1);
185: push(xxrept);
186: }
187: optuntil: xxtab unttok pred
188: |
189: ;
190:
191: unttok: xxuntil = {
192: putout('\t',"\t");
193: putout(xxuntil,"until");
194: free($1);
195: }
196: dotok: dopart opdotok
197: ;
198: dopart: xxdo identtok '=' expr ',' expr =
199: {push(xxdo);
200: putout(xxdo,"do");
201: free($1);
202: puttree($2);
203: putout('=',"=");
204: free($3);
205: puttree($4);
206: putout(',',",");
207: free($5);
208: puttree($6);
209: }
210: opdotok: ',' expr = {
211: putout(',',",");
212: puttree($2);
213: }
214: | ;
215: lbtok: '{' = {
216: putout('{'," {");
217: push(xxlb);
218: }
219: rbtok: '}' = { putout('}',"}"); pop(); }
220: labtok: xxnum = {
221: tab(xxindent);
222: putout(xxnum,$1);
223: putout(' '," ");
224: xxlablast = 1;
225: }
226: comtok: xxcom = { putout(xxcom,$1); free($1); xxlablast = 0; }
227: | comtok xxcom = { putout ('\n',"\n"); putout(xxcom,$2); free($2); xxlablast = 0; };
228: %%
229: #define ASSERT(X,Y) if (!(X)) error("struct bug: assertion 'X' invalid in routine Y","","");
230:
231: yyerror(s)
232: char *s;
233: {
234: extern int yychar;
235: fprintf(stderr,"\n%s",s);
236: fprintf(stderr," in beautifying, output line %d,",xxlineno + 1);
237: fprintf(stderr," on input: ");
238: switch (yychar) {
239: case '\t': fprintf(stderr,"\\t\n"); return;
240: case '\n': fprintf(stderr,"\\n\n"); return;
241: case '\0': fprintf(stderr,"$end\n"); return;
242: default: fprintf(stderr,"%c\n",yychar); return;
243: }
244: }
245:
246: yyinit(argc, argv) /* initialize pushdown store */
247: int argc;
248: char *argv[];
249: {
250: xxindent = 0;
251: xxbpertab = 8;
252: xxmaxchars = 120;
253: }
254:
255:
256: #include <signal.h>
257: main()
258: {
259: int exit();
260: if ( signal(SIGINT, SIG_IGN) != SIG_IGN)
261: signal(SIGINT, exit);
262: yyinit();
263: yyparse();
264: }
265:
266:
267: putout(type,string) /* output string with proper indentation */
268: int type;
269: char *string;
270: {
271: static int lasttype;
272: if ( (lasttype != 0) && (lasttype != '\n') && (lasttype != ' ') && (lasttype != '\t') && (type == xxcom))
273: accum("\t");
274: else if (lasttype == xxcom && type != '\n')
275: tab(xxindent);
276: else
277: if (lasttype == xxif ||
278: lasttype == xxwhile ||
279: lasttype == xxdo ||
280: type == '=' ||
281: lasttype == '=' ||
282: (lasttype == xxident && (type == xxident || type == xxnum) ) ||
283: (lasttype == xxnum && type == xxnum) )
284: accum(" ");
285: accum(string);
286: lasttype = type;
287: }
288:
289:
290: accum(token) /* fill output buffer, generate continuation lines */
291: char *token;
292: {
293: static char *buffer;
294: static int lstatus,llen,bufind;
295: int tstatus,tlen,i;
296:
297: #define NEW 0
298: #define MID 1
299: #define CONT 2
300:
301: if (buffer == 0)
302: {
303: buffer = malloc(xxmaxchars);
304: if (buffer == 0) error("malloc out of space","","");
305: }
306: tlen = slength(token);
307: if (tlen == 0) return;
308: for (i = 0; i < tlen; ++i)
309: ASSERT(token[i] != '\n' || tlen == 1,accum);
310: switch(token[tlen-1])
311: {
312: case '\n': tstatus = NEW;
313: break;
314: case '+':
315: case '-':
316: case '*':
317: case ',':
318: case '|':
319: case '&':
320: case '(': tstatus = CONT;
321: break;
322: default: tstatus = MID;
323: }
324: if (llen + bufind + tlen > xxmaxchars && lstatus == CONT && tstatus != NEW)
325: {
326: putchar('\n');
327: ++xxlineno;
328: for (i = 0; i < xxindent; ++i)
329: putchar('\t');
330: putchar(' ');putchar(' ');
331: llen = 2 + xxindent * xxbpertab;
332: lstatus = NEW;
333: }
334: if (lstatus == CONT && tstatus == MID)
335: { /* store in buffer in case need \n after last CONT char */
336: ASSERT(bufind + tlen < xxmaxchars,accum);
337: for (i = 0; i < tlen; ++i)
338: buffer[bufind++] = token[i];
339: }
340: else
341: {
342: for (i = 0; i < bufind; ++i)
343: putchar(buffer[i]);
344: llen += bufind;
345: bufind = 0;
346: for (i = 0; i < tlen; ++i)
347: putchar(token[i]);
348: if (tstatus == NEW) ++xxlineno;
349: llen = (tstatus == NEW) ? 0 : llen + tlen;
350: lstatus = tstatus;
351: }
352: }
353:
354: tab(n)
355: int n;
356: {
357: int i;
358: newline();
359: for ( i = 0; i < n; ++i)
360: putout('\t',"\t");
361: }
362:
363: newline()
364: {
365: static int already;
366: if (already)
367: putout('\n',"\n");
368: else
369: already = 1;
370: }
371:
372: error(mess1, mess2, mess3)
373: char *mess1, *mess2, *mess3;
374: {
375: fprintf(stderr,"\nerror in beautifying, output line %d: %s %s %s \n",
376: xxlineno, mess1, mess2, mess3);
377: exit(1);
378: }
379:
380:
381:
382:
383:
384:
385:
386: push(type)
387: int type;
388: {
389: if (++xxstind > xxtop)
390: error("nesting too deep, stack overflow","","");
391: xxstack[xxstind] = type;
392: }
393:
394: pop()
395: {
396: if (xxstind <= 0)
397: error("stack exhausted, can't be popped as requested","","");
398: --xxstind;
399: }
400:
401:
402: forst()
403: {
404: while( (xxval = yylex()) != '\n')
405: {
406: putout(xxval, yylval);
407: free(yylval);
408: }
409: free(yylval);
410: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.