Annotation of 43BSD/contrib/apl/src/apl.y, revision 1.1

1.1     ! root        1: %{
        !             2: static char apl_y_Sccsid[] = "apl.y @(#)apl.y  1.3     10/5/82 Berkeley ";
        !             3: %}
        !             4: %union {
        !             5:        char    *charptr;
        !             6:        char    charval;
        !             7: }
        !             8: %term   lex0, lex1, lex2, lex3, lex4, lex5, lex6
        !             9: %term lpar, rpar, lbkt, rbkt, eol, unk
        !            10: %term <charval> com, com0, Quad, asg
        !            11: %term null, dot, cln, semi, comnt, tran
        !            12: %term <charptr> strng nam, numb, nfun, mfun, dfun
        !            13: %term <charval> comexpr, comnam, comnull, comlist
        !            14: 
        !            15: %term <charval> dscal, mdscal
        !            16: %term <charval> m, d, md, msub, mdsub
        !            17: 
        !            18: %type <charptr> func, header, args, autos, labels, label
        !            19: %type <charptr> fstat0, stat, statement, output, expr
        !            20: %type <charptr> e1, e2, number, subs, sub, monadic
        !            21: %type <charptr> dyadic, subr, anyname, hprint
        !            22: %type <charval> comand, lsub, monad, smonad, sdyad
        !            23: %type <charval> comp, dyad, mdcom, mondya, scalar
        !            24: 
        !            25: %{
        !            26: #include "apl.h"
        !            27:        int     vcount;
        !            28:        int     scount;
        !            29:        int     litflag;
        !            30:        int     nlexsym;
        !            31:        int     context;
        !            32:        char    *iline;
        !            33:        char    *ccharp, *ccharp2;
        !            34:        data    lnumb;          /* current label number */
        !            35:        char    *labcpp;        /* label prologue */
        !            36:        char    *labcpe;        /* label epilogue */
        !            37:        int     immedcmd;       /* immediate command number */
        !            38: %}
        !            39: 
        !            40: %%
        !            41: 
        !            42: /*
        !            43:  * line-at-a-time APL compiler.
        !            44:  * first lexical character gives context.
        !            45:  */
        !            46: line:
        !            47: 
        !            48: /*
        !            49:  * immediate.
        !            50:  */
        !            51:     lex0 stat =
        !            52:        {
        !            53:                integ = ccharp[-1];
        !            54:                if(integ != ASGN && integ != PRINT && integ != COMNT)
        !            55:                        *ccharp++ = PRINT;
        !            56:                *ccharp++ = EOL;
        !            57:        } |
        !            58:     lex0 bcomand comand eol =
        !            59:        {
        !            60:                *ccharp++ = IMMED;
        !            61:                *ccharp++ = $3;
        !            62:        } |
        !            63: /*
        !            64:  * immediate mode state indicator stuff
        !            65:  */
        !            66:     lex0 tran eol =
        !            67:        {
        !            68:                *ccharp++ = SICLR0;
        !            69:        } |
        !            70:     lex0 tran expr eol =
        !            71:        {
        !            72:                *ccharp++ = SICLR;
        !            73:        } |
        !            74: /*
        !            75:  * quad input
        !            76:  */
        !            77:     lex1 stat |
        !            78: /*
        !            79:  * function definition
        !            80:  */
        !            81:     lex2 func |
        !            82: /*
        !            83:  * function prolog
        !            84:  */
        !            85:     lex3 func |
        !            86: /*
        !            87:  * function epilog
        !            88:  */
        !            89:     lex4 func |
        !            90: /*
        !            91:  * function body
        !            92:  */
        !            93:     lex5 fstat ;
        !            94: 
        !            95: 
        !            96: 
        !            97: 
        !            98: 
        !            99: 
        !           100: 
        !           101: 
        !           102: 
        !           103: /*
        !           104:  * function header
        !           105:  */
        !           106: func:
        !           107:     anyname asg header =
        !           108:        {
        !           109:                switch(context) {
        !           110: 
        !           111:                case lex3:
        !           112:                        name($$, AUTO);
        !           113:                        /*
        !           114:                         * see comments in ai.c/funcomp() concerning
        !           115:                         * label processing.
        !           116:                         */
        !           117:                        *ccharp++ = ELID;
        !           118:                        break;
        !           119: 
        !           120:                case lex4:
        !           121:                        ccharp2 = ccharp;
        !           122:                        *ccharp++ = EOL;
        !           123:                        name($$, RVAL);
        !           124:                        name($$, REST);
        !           125:                        invert($3, ccharp2);
        !           126:                }
        !           127:        } |
        !           128:     header =
        !           129:        {
        !           130:                if(context == lex3)
        !           131:                        *ccharp++ = ELID;
        !           132:                if(context == lex4){
        !           133:                        *ccharp++ = EOL;        /* pop previous result */
        !           134:                        *ccharp++ = NILRET;     /* return empty result */
        !           135:                }
        !           136:        } ;
        !           137: header:
        !           138:     args autos =
        !           139:        {
        !           140:                if(context == lex4)
        !           141:                        invert($$, $2);
        !           142:        } ;
        !           143: 
        !           144: args:
        !           145:     anyname anyname anyname =
        !           146:        {
        !           147:                $$ = ccharp;
        !           148:                switch(context) {
        !           149: 
        !           150:                case lex2:
        !           151:                        name($2, DF);
        !           152:                        break;
        !           153: 
        !           154:                case lex3:
        !           155:                        name($3, ARG2);
        !           156:                        name($1, ARG1);
        !           157:                        break;
        !           158: 
        !           159:                case lex4:
        !           160:                        name($1, REST);
        !           161:                        name($3, REST);
        !           162:                }
        !           163:        } |
        !           164:     anyname anyname =
        !           165:        {
        !           166:                $$ = ccharp;
        !           167:                switch(context) {
        !           168: 
        !           169:                case lex2:
        !           170:                        name($1, MF);
        !           171:                        break;
        !           172: 
        !           173:                case lex3:
        !           174:                        name($2, ARG1);
        !           175:                        break;
        !           176: 
        !           177:                case lex4:
        !           178:                        name($2, REST);
        !           179:                }
        !           180:        } |
        !           181:     anyname =
        !           182:        {
        !           183:                if(context == lex2)
        !           184:                        name($$, NF);
        !           185:                $$ = ccharp;
        !           186:        } ;
        !           187: autos:
        !           188:     semi nam autos =
        !           189:        {
        !           190:                $$ = $3;
        !           191:                switch(context) {
        !           192: 
        !           193:                case lex3:
        !           194:                        name($2, AUTO);
        !           195:                        break;
        !           196: 
        !           197:                case lex4:
        !           198:                        ccharp2 = name($2, REST);
        !           199:                        invert($$, ccharp2);
        !           200:                }
        !           201:        } |
        !           202:     eol =
        !           203:        {
        !           204:                $$ = ccharp;
        !           205:        } ;
        !           206: 
        !           207: /*
        !           208:  * system commands
        !           209:  */
        !           210: bcomand:
        !           211:     rpar =
        !           212:        {
        !           213:                litflag = -1;
        !           214:        } ;
        !           215: comand:
        !           216:     comexpr expr |
        !           217:     comnam anyname =
        !           218:        {
        !           219:                name($2, NAME);
        !           220:        } |
        !           221:     comlist anylist |
        !           222:     comnull ;
        !           223: 
        !           224: anylist:
        !           225:     anylist anyname =
        !           226:        {
        !           227:            *ccharp++ = IMMED;
        !           228:            *ccharp++ = immedcmd;
        !           229:            name($2, NAME);
        !           230:        } |
        !           231:     anyname =
        !           232:        {
        !           233:            name($1, NAME);
        !           234:        };
        !           235: 
        !           236: 
        !           237: /*
        !           238:  * statement:
        !           239:  *     comments
        !           240:  *     expressions
        !           241:  *     heterogeneous output
        !           242:  *     transfers (in functions)
        !           243:  */
        !           244: fstat:
        !           245:        labels fstat0 | fstat0;
        !           246: 
        !           247: labels:
        !           248:        label | labels label;
        !           249: 
        !           250: label:
        !           251:        anyname cln = {
        !           252:                if(labgen)
        !           253:                        genlab($1);
        !           254:        }  ;
        !           255: 
        !           256: fstat0:
        !           257:     stat =
        !           258:        {
        !           259:                integ = ccharp[-1];
        !           260:                if(integ != ASGN && integ != PRINT && integ != COMNT)
        !           261:                        *ccharp++ = PRINT;
        !           262:        } |
        !           263:     tran eol =
        !           264:        {
        !           265:                $$ = ccharp;
        !           266:                *ccharp++ = BRAN0;
        !           267:        } |
        !           268:     tran expr eol =
        !           269:        {
        !           270:                $$ = $2;
        !           271:                *ccharp++ = BRAN;
        !           272:        } ;
        !           273: stat:
        !           274:     eol =
        !           275:        {
        !           276:                $$ = ccharp;
        !           277:                *ccharp++ = COMNT;
        !           278:        } |
        !           279:     statement eol ;
        !           280: statement:
        !           281:     comnt =
        !           282:        {
        !           283:                litflag = 1;
        !           284:                $$ = ccharp;
        !           285:                *ccharp++ = COMNT;
        !           286:        } |
        !           287:     expr |
        !           288:     hprint ;
        !           289: hprint:
        !           290:     expr hsemi output ;
        !           291: output:
        !           292:     expr =
        !           293:        {
        !           294:                *ccharp++ = PRINT;
        !           295:        } |
        !           296:     hprint ;
        !           297: hsemi:
        !           298:     semi =
        !           299:        {
        !           300:                *ccharp++ = HPRINT;
        !           301:        };
        !           302: expr:
        !           303:     e1 |
        !           304:     monadic expr =
        !           305:        {
        !           306:                invert($$, $2);
        !           307:        } |
        !           308:     e1 dyadic expr =
        !           309:        {
        !           310:                invert($$, $3);
        !           311:        } ;
        !           312: e1:
        !           313:     e2 |
        !           314:     e2 lsub subs rbkt =
        !           315:        {
        !           316:                invert($$, $3);
        !           317:                *ccharp++ = INDEX;
        !           318:                *ccharp++ = scount;
        !           319:                scount = $2;
        !           320:        } ;
        !           321: e2:
        !           322:     nfun =
        !           323:        {
        !           324:                $$ = name($$, FUN);
        !           325:        } |
        !           326:     nam =
        !           327:        {
        !           328:                $$ = name($$, NAME);
        !           329:        } |
        !           330:     strng =
        !           331:        {
        !           332:                $$ = ccharp;
        !           333:                ccharp += 2;
        !           334:                integ = iline[-1];
        !           335:                vcount = 0;
        !           336:                for(;;) {
        !           337:                        if(*iline == '\n') {
        !           338:                                nlexsym = unk;
        !           339:                                break;
        !           340:                        }
        !           341:                        if(*iline == integ) {
        !           342:                                iline++;
        !           343:                                if(*iline != integ)
        !           344:                                        break;
        !           345:                        }
        !           346:                        *ccharp++ = *iline++;
        !           347:                        vcount++;
        !           348:                }
        !           349:                ((struct chrstrct *)$$)->c[0] = QUOT;
        !           350:                ((struct chrstrct *)$$)->c[1] = vcount;
        !           351:        } |
        !           352:     vector =
        !           353:        {
        !           354:                *ccharp++ = CONST;
        !           355:                *ccharp++ = vcount;
        !           356:                invert($$, ccharp-2);
        !           357:        } |
        !           358:     lpar expr rpar =
        !           359:        {
        !           360:                $$ = $2;
        !           361:        } |
        !           362:     Quad =
        !           363:        {
        !           364:                $$ = ccharp;
        !           365:                *ccharp++ = $1;
        !           366:        } ;
        !           367: vector:
        !           368:     number vector =
        !           369:        {
        !           370:                vcount++;
        !           371:        } |
        !           372:     number =
        !           373:        {
        !           374:                vcount = 1;
        !           375:        } ;
        !           376: number:
        !           377:     numb =
        !           378:        {
        !           379:                $$ = ccharp;
        !           380:                ccharp += copy(DA,&datum,ccharp,1);
        !           381:        } ;
        !           382: 
        !           383: /*
        !           384:  * indexing subscripts
        !           385:  * optional expressions separated by semi
        !           386:  */
        !           387: lsub:
        !           388:     lbkt =
        !           389:        {
        !           390:                $$ = scount;
        !           391:                scount = 1;
        !           392:        } ;
        !           393: subs:
        !           394:     sub |
        !           395:     subs semi sub =
        !           396:        {
        !           397:                invert($$, $3);
        !           398:                scount++;
        !           399:        } ;
        !           400: sub:
        !           401:     expr |
        !           402:        =
        !           403:        {
        !           404:                $$ = ccharp;
        !           405:                *ccharp++ = ELID;
        !           406:        } ;
        !           407: 
        !           408: /*
        !           409:  * return a string of a monadic operator.
        !           410:  */
        !           411: monadic:
        !           412:     monad =
        !           413:        {
        !           414:                $$ = ccharp;
        !           415:                *ccharp++ = $1;
        !           416:        } |
        !           417:     smonad subr =
        !           418:        {
        !           419:                $$ = $2;
        !           420:                *ccharp++ = $1+1;
        !           421:        } |
        !           422:     mfun =
        !           423:        {
        !           424:                $$ = name($$, FUN);
        !           425:        } |
        !           426:     scalar comp =
        !           427:        {
        !           428:                $$ = ccharp;
        !           429:                *ccharp++ = $2+1;
        !           430:                *ccharp++ = $1;
        !           431:        } |
        !           432:     scalar com subr =
        !           433:        {
        !           434:                $$ = $3;
        !           435:                *ccharp++ = $2+3;
        !           436:                *ccharp++ = $1;
        !           437:        } ;
        !           438: monad:
        !           439:     m |
        !           440:     msub |
        !           441:     mondya =
        !           442:        {
        !           443:                $$++;
        !           444:        } ;
        !           445: smonad:
        !           446:     msub |
        !           447:     mdsub =
        !           448:        {
        !           449:                $$ += 2;
        !           450:        } ;
        !           451: 
        !           452: /*
        !           453:  * return a string of a dyadic operator.
        !           454:  */
        !           455: dyadic:
        !           456:     dyad =
        !           457:        {
        !           458:                $$ = ccharp;
        !           459:                *ccharp++ = $1;
        !           460:        } |
        !           461:     sdyad subr =
        !           462:        {
        !           463:                $$ = $2;
        !           464:                *ccharp++ = $1;
        !           465:        } |
        !           466:     dfun =
        !           467:        {
        !           468:                $$ = name($$, FUN);
        !           469:        } |
        !           470:     null dot scalar =
        !           471:        {
        !           472:                $$ = ccharp;
        !           473:                *ccharp++ = OPROD;
        !           474:                *ccharp++ = $3;
        !           475:        } |
        !           476:     scalar dot scalar =
        !           477:        {
        !           478:                $$ = ccharp;
        !           479:                *ccharp++ = IPROD;
        !           480:                *ccharp++ = $1;
        !           481:                *ccharp++ = $3;
        !           482:        } ;
        !           483: sdyad:
        !           484:     mdcom =
        !           485:        {
        !           486:                $$ += 2;
        !           487:        } ;
        !           488: 
        !           489: /*
        !           490:  * single expression subscript
        !           491:  * as found on operators to select
        !           492:  * a dimension.
        !           493:  */
        !           494: subr:
        !           495:     lbkt expr rbkt =
        !           496:        {
        !           497:                $$ = $2;
        !           498:        } ;
        !           499: 
        !           500: /*
        !           501:  * various combinations
        !           502:  */
        !           503: comp:
        !           504:     com | com0 ;
        !           505: dyad:
        !           506:     mondya | dscal | d | com0 | asg | com ;
        !           507: mdcom:
        !           508:     mdsub | com ;
        !           509: mondya:
        !           510:     mdscal | md | mdsub ;
        !           511: scalar:
        !           512:     mdscal | dscal ;
        !           513: anyname:
        !           514:     nam | nfun | mfun | dfun ;
        !           515: %%
        !           516: #include "tab.c"
        !           517: #include "lex.c"

unix.superglobalmegacorp.com

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