|
|
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 %prec xxuminus = $$ = $2;
134: | '!' expr = $$ = addroot($1,'!',$2,0);
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 '<' expr = $$ = addroot($2,'<',$1,$3);
144: | expr xxeq expr = $$ = addroot($2,xxeq,$1,$3);
145: | expr xxle expr = $$ = addroot($2,xxle,$1,$3);
146: | expr xxge expr = $$ = addroot($2,xxge,$1,$3);
147: | expr xxne expr = $$ = addroot($2,xxne,$1,$3);
148: | identtok = $$ = $1;
149: | xxnum = $$ = addroot($1,xxnum,0,0);
150: | xxstring = $$ = addroot($1,xxstring,0,0);
151: ;
152:
153: iftok: xxif =
154: {
155: if (xxstack[xxstind] == xxelse && !xxlablast)
156: {
157: --xxindent;
158: xxstack[xxstind] = xxelseif;
159: putout(' '," ");
160: }
161: else
162: {
163: if (!xxlablast)
164: tab(xxindent);
165: xxlablast = 0;
166: }
167: putout(xxif,"if");
168: free($1);
169: push(xxif);
170: }
171: elsetok: xxelse =
172: {
173: tab(xxindent);
174: putout(xxelse,"else");
175: free($1);
176: push(xxelse);
177: }
178: whtok: xxwhile = {
179: putout(xxwhile,"while");
180: free($1);
181: push(xxwhile);
182: }
183: rpttok: xxrept = {
184: putout(xxrept,"repeat");
185: free($1);
186: push(xxrept);
187: }
188: optuntil: xxtab unttok pred
189: |
190: ;
191:
192: unttok: xxuntil = {
193: putout('\t',"\t");
194: putout(xxuntil,"until");
195: free($1);
196: }
197: dotok: dopart opdotok
198: ;
199: dopart: xxdo identtok '=' expr ',' expr =
200: {push(xxdo);
201: putout(xxdo,"do");
202: free($1);
203: puttree($2);
204: putout('=',"=");
205: free($3);
206: puttree($4);
207: putout(',',",");
208: free($5);
209: puttree($6);
210: }
211: opdotok: ',' expr = {
212: putout(',',",");
213: puttree($2);
214: }
215: | ;
216: lbtok: '{' = {
217: putout('{'," {");
218: push(xxlb);
219: }
220: rbtok: '}' = { putout('}',"}"); pop(); }
221: labtok: xxnum = {
222: tab(xxindent);
223: putout(xxnum,$1);
224: putout(' '," ");
225: xxlablast = 1;
226: }
227: comtok: xxcom = { putout(xxcom,$1); free($1); xxlablast = 0; }
228: | comtok xxcom = { putout ('\n',"\n"); putout(xxcom,$2); free($2); xxlablast = 0; };
229: %%
230: #define ASSERT(X,Y) if (!(X)) error("struct bug: assertion 'X' invalid in routine Y","","");
231:
232: yyerror(s)
233: char *s;
234: {
235: extern int yychar;
236: fprintf(stderr,"\n%s",s);
237: fprintf(stderr," in beautifying, output line %d,",xxlineno + 1);
238: fprintf(stderr," on input: ");
239: switch (yychar) {
240: case '\t': fprintf(stderr,"\\t\n"); return;
241: case '\n': fprintf(stderr,"\\n\n"); return;
242: case '\0': fprintf(stderr,"$end\n"); return;
243: default: fprintf(stderr,"%c\n",yychar); return;
244: }
245: }
246:
247: yyinit(argc, argv) /* initialize pushdown store */
248: int argc;
249: char *argv[];
250: {
251: xxindent = 0;
252: xxbpertab = 8;
253: xxmaxchars = 120;
254: }
255:
256:
257: #include <signal.h>
258: main()
259: {
260: int exit();
261: if ( signal(SIGINT, SIG_IGN) != SIG_IGN)
262: signal(SIGINT, exit);
263: yyinit();
264: yyparse();
265: }
266:
267:
268: putout(type,string) /* output string with proper indentation */
269: int type;
270: char *string;
271: {
272: static int lasttype;
273: if ( (lasttype != 0) && (lasttype != '\n') && (lasttype != ' ') && (lasttype != '\t') && (type == xxcom))
274: accum("\t");
275: else if (lasttype == xxcom && type != '\n')
276: tab(xxindent);
277: else
278: if (lasttype == xxif ||
279: lasttype == xxwhile ||
280: lasttype == xxdo ||
281: type == '=' ||
282: lasttype == '=' ||
283: (lasttype == xxident && (type == xxident || type == xxnum) ) ||
284: (lasttype == xxnum && type == xxnum) )
285: accum(" ");
286: accum(string);
287: lasttype = type;
288: }
289:
290:
291: accum(token) /* fill output buffer, generate continuation lines */
292: char *token;
293: {
294: static char *buffer;
295: static int lstatus,llen,bufind;
296: int tstatus,tlen,i;
297:
298: #define NEW 0
299: #define MID 1
300: #define CONT 2
301:
302: if (buffer == 0)
303: {
304: buffer = malloc(xxmaxchars);
305: if (buffer == 0) error("malloc out of space","","");
306: }
307: tlen = slength(token);
308: if (tlen == 0) return;
309: for (i = 0; i < tlen; ++i)
310: ASSERT(token[i] != '\n' || tlen == 1,accum);
311: switch(token[tlen-1])
312: {
313: case '\n': tstatus = NEW;
314: break;
315: case '+':
316: case '-':
317: case '*':
318: case ',':
319: case '|':
320: case '&':
321: case '(': tstatus = CONT;
322: break;
323: default: tstatus = MID;
324: }
325: if (llen + bufind + tlen > xxmaxchars && lstatus == CONT && tstatus != NEW)
326: {
327: putchar('\n');
328: ++xxlineno;
329: for (i = 0; i < xxindent; ++i)
330: putchar('\t');
331: putchar(' ');putchar(' ');
332: llen = 2 + xxindent * xxbpertab;
333: lstatus = NEW;
334: }
335: if (lstatus == CONT && tstatus == MID)
336: { /* store in buffer in case need \n after last CONT char */
337: ASSERT(bufind + tlen < xxmaxchars,accum);
338: for (i = 0; i < tlen; ++i)
339: buffer[bufind++] = token[i];
340: }
341: else
342: {
343: for (i = 0; i < bufind; ++i)
344: putchar(buffer[i]);
345: llen += bufind;
346: bufind = 0;
347: for (i = 0; i < tlen; ++i)
348: putchar(token[i]);
349: if (tstatus == NEW) ++xxlineno;
350: llen = (tstatus == NEW) ? 0 : llen + tlen;
351: lstatus = tstatus;
352: }
353: }
354:
355: tab(n)
356: int n;
357: {
358: int i;
359: newline();
360: for ( i = 0; i < n; ++i)
361: putout('\t',"\t");
362: }
363:
364: newline()
365: {
366: static int already;
367: if (already)
368: putout('\n',"\n");
369: else
370: already = 1;
371: }
372:
373: error(mess1, mess2, mess3)
374: char *mess1, *mess2, *mess3;
375: {
376: fprintf(stderr,"\nerror in beautifying, output line %d: %s %s %s \n",
377: xxlineno, mess1, mess2, mess3);
378: exit(1);
379: }
380:
381:
382:
383:
384:
385:
386:
387: push(type)
388: int type;
389: {
390: if (++xxstind > xxtop)
391: error("nesting too deep, stack overflow","","");
392: xxstack[xxstind] = type;
393: }
394:
395: pop()
396: {
397: if (xxstind <= 0)
398: error("stack exhausted, can't be popped as requested","","");
399: --xxstind;
400: }
401:
402:
403: forst()
404: {
405: while( (xxval = yylex()) != '\n')
406: {
407: putout(xxval, yylval);
408: free(yylval);
409: }
410: free(yylval);
411: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.