Annotation of 42BSD/usr.bin/struct/beauty.y, revision 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.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:        }

unix.superglobalmegacorp.com

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