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