Annotation of 43BSDReno/pgrm/struct/beautify/beauty.y, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.