Annotation of researchv10no/cmd/pret/pret.y, revision 1.1

1.1     ! root        1: %{
        !             2: #include <stdio.h>
        !             3: #include "pret.h"
        !             4: #include "pret.d"
        !             5: 
        !             6: #define YYDEBUG 1
        !             7: 
        !             8: struct Node {
        !             9:        int ntyp;       /* OP ~ nval&left&right, NM ~ val */
        !            10:        int nval;
        !            11:        struct Node *left, *right;
        !            12: };
        !            13: 
        !            14: extern struct Node *newnode();
        !            15: 
        !            16: struct PARS {
        !            17:        int home;
        !            18:        int dest;
        !            19:        int bpnt;
        !            20: } ties[MAXDEPTH];
        !            21: 
        !            22: FILE *tb;                              /* temp file to store tables */
        !            23: 
        !            24: char procname[MAXNAME], refname[MAXNAME], qsetname[MAXNAME];
        !            25: char str[256], filename[256];
        !            26: char strings[MANY][MAXNAME];
        !            27: extern char yytext[];
        !            28: extern struct QTABLE qtable[NQUEUES];
        !            29: extern int varwidths;
        !            30: int nnames = 0;
        !            31: int linenumber = 1;
        !            32: int linecode = 0;      /* include source code references  */
        !            33: int nest = 0;          /* nesting level of comments (lex) */
        !            34: int anyerror = 0;
        !            35: 
        !            36: int pid = NONE;        /* process number  */
        !            37: int qid = NONE;        /* queue number    */
        !            38: int rid = NONE;        /* template number when defined */
        !            39: int sid = NONE;        /* qset number     */
        !            40: int nid = NONE;        /* template number when refered */
        !            41: int cid = NONE;        /* index in call table          */
        !            42: int qind, qisz;                /* queue's initial string size  */
        !            43: int parnum;            /* counts actual parameters     */
        !            44: int assertion = -1;    /* id of assertion table, if any */
        !            45: int inertion = -1;     /* id of error table, if any */
        !            46: int vartype, inside;
        !            47: int n, m, from, xx, zz;
        !            48: int soo = 0;           /* start of optionlist */
        !            49: int curstate = 0;
        !            50: int curdepth = 0;
        !            51: int lastloop = -1;
        !            52: 
        !            53: int verbose = 0;
        !            54: int nopurge = 0;
        !            55: 
        !            56: checknames()
        !            57: {
        !            58:        checkrefs();
        !            59:        checkglobvars();
        !            60:        checkqs();
        !            61: }
        !            62: 
        !            63: putglobals(fd)
        !            64:        FILE *fd;
        !            65: {
        !            66:        numrefs(fd);
        !            67:        numprocs(fd);
        !            68:        numsorts(fd);
        !            69:        numinits(fd);
        !            70:        numglobvars(fd);
        !            71: }
        !            72: 
        !            73: puttables(fd1)
        !            74:        FILE *fd1;
        !            75: {      FILE *fd2;
        !            76:        char buffer[MANY];
        !            77:        int howmuch;
        !            78: 
        !            79:        if ((fd2 = fopen("pret.tmp", "r")) == NULL)
        !            80:                whoops("cannot find pret.tmp");
        !            81: 
        !            82:        while ((howmuch = fread(buffer, sizeof(*buffer), MANY, fd2)) > 0)
        !            83:                fwrite(buffer, sizeof(*buffer), howmuch, fd1);
        !            84: 
        !            85:        fclose(fd2);
        !            86:        unlink("pret.tmp");
        !            87: }
        !            88: 
        !            89: makebin()
        !            90: {      FILE *fd;
        !            91: 
        !            92:        if ((fd = fopen((anyerror)?"pret.err":"pret.out", "w")) == NULL)
        !            93:                whoops("cannot create output file");
        !            94: 
        !            95:        putglobals(fd);
        !            96:        puttables(fd);
        !            97:        numexps(fd);
        !            98:        fclose(fd);
        !            99:        if (anyerror)
        !           100:                fprintf(stderr, "output written to `pret.err'\n");
        !           101: }
        !           102: 
        !           103: transfer(cl, tg)
        !           104: {      int i = curstate;
        !           105:        curstate = enterowname(NEW, "", DAR);
        !           106:        setrans(i, cl, curstate, tg);
        !           107: }
        !           108: 
        !           109: #include "pret.expr.c"
        !           110: 
        !           111: %}
        !           112: %union{
        !           113:        int resu;
        !           114:        struct Node *node;
        !           115: }
        !           116: 
        !           117: %type  <resu>  PREIO INDEX QINDEX IMPORT ASGN ASGN
        !           118: %type  <node>  expr VARNAME
        !           119: %token <resu>  NAME VALUE ARNAME QSNAME
        !           120: 
        !           121: %start         PROT_SPEC
        !           122: %token         ASSERT ERROR
        !           123: %token         PROCESS PBEGIN END IF FI DO OD
        !           124: %token         timeout skip BREAK DEFAULT GOTO
        !           125: %token         FLAG ARROW SEMICOLON COLON
        !           126: %token         QUEUES QSET PVAR MESG
        !           127: %right         '=' ADDEQ SUBEQ MULEQ DIVEQ MODEQ
        !           128: %left          OR
        !           129: %left          AND
        !           130: %left          GT GE LT LE EQ NE
        !           131: %left          '+' '-'
        !           132: %left          '*' '/' '%'
        !           133: %left          UNARYMINUS NOT INC DEC
        !           134: %right         '^'
        !           135: 
        !           136: %%
        !           137: 
        !           138: PROT_SPEC      :       ONEMODULE
        !           139:                |       PROT_SPEC ONEMODULE
        !           140:                ;
        !           141: 
        !           142: ONEMODULE      :       PROC_SPEC
        !           143:                |       TASK_SPEC
        !           144:                |       ONEDECL
        !           145:                |       REQUIREMENT
        !           146:                ;
        !           147: 
        !           148: PROC_SPEC      :       PROCESS NAME QINDEX
        !           149:                        {       strcpy(procname, strings[$2]);
        !           150:                                pid = newprocname(strings[$2], $3);
        !           151:                        }
        !           152:                        PBEGIN ANYDECLS
        !           153:                        { extern int extras;
        !           154:                          int ival;
        !           155:                                curstate = enterowname(NEW, "", DAR);
        !           156:                                newcalltable();
        !           157:                                ival = 3*MANY+pid+extras;
        !           158:                                addvarname("_PROCID", (DCL|RFR), ival, NONE, 0);
        !           159:                        }
        !           160:                        SEQUENCE END
        !           161:                        {       wrapup(NONE, pid, tb, nopurge, verbose);
        !           162:                                pid = NONE;
        !           163:                                strcpy(procname, "_");
        !           164:                        }
        !           165:                ;
        !           166: 
        !           167: ANYDECLS       :       /* empty */
        !           168:                |       DECLS
        !           169:                ;
        !           170: DECLS          :       ONEDECL
        !           171:                |       DECLS ONEDECL
        !           172:                ;
        !           173: 
        !           174: ONEDECL                :       QDECLS
        !           175:                |       VARDECLS
        !           176:                ;
        !           177: /*
        !           178:  *     QUEUES
        !           179:  *      ======
        !           180:  */
        !           181: 
        !           182: QDECLS         :       QUEUES QDECL SEPARATOR
        !           183:                ;
        !           184: QDECL          :       ONEQ
        !           185:                |       QNAMELIST
        !           186:                ;
        !           187: 
        !           188: ONEQ           :       NAME QINDEX '='
        !           189:                        {       if ($2 == NONE || (qisz=$2) <= 0)
        !           190:                                yyerror("illegal queue size, %s", strings[$1]);
        !           191:                                qid = newqname(strings[$1], DCL, qisz, NONE);
        !           192:                        }
        !           193:                        PBEGIN MNAMELIST END
        !           194:                ;
        !           195: 
        !           196: /*
        !           197:  *     VARIABLES and QUEUESETS
        !           198:  *      =======================
        !           199:  */
        !           200: 
        !           201: VARDECLS       :       PVAR VNAMELIST  SEPARATOR
        !           202:                |       QSET QSETDECL SEPARATOR
        !           203:                ;
        !           204: 
        !           205: QINDEX         :       /* empty */     { $$ = NONE; }
        !           206:                |       '[' VALUE ']'   { $$ =   $2; }
        !           207:                ;
        !           208: 
        !           209: QSETDECL       :       NAME PBEGIN NAME QINDEX COLON
        !           210:                        {       xx = newqname(strings[$3], RFR, NONE, $4);
        !           211:                                sid = newqset(strings[$1], strings[$3], DCL, $4);
        !           212:                        }
        !           213:                        SNAMELIST END
        !           214:                        {       closeqset(sid);
        !           215:                        }
        !           216:                ;
        !           217: /*
        !           218:  *     PROCEDURES
        !           219:  *      ==========
        !           220:  */
        !           221: 
        !           222: TASK_SPEC      :       NAME
        !           223:                        {       rid = newreftask(strings[$1], DCL);
        !           224:                                curstate = enterowname(NEW, "", DAR);
        !           225:                                strcpy(refname, strings[$1]);
        !           226:                                newcalltable();
        !           227:                                vartype = ISV;
        !           228:                                inside = 1;
        !           229:                        }
        !           230:                        '(' ANYPARAMS ')'
        !           231:                        {       inside = 0;
        !           232:                        }
        !           233:                        ANYPARTYPES
        !           234:                        {       reorder();      /* renumber formal parameters */
        !           235:                        }
        !           236:                        PBEGIN
        !           237:                        ANYDECLS
        !           238:                        SEQUENCE
        !           239:                        END
        !           240:                        {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           241:                                strcpy(refname, "_");
        !           242:                                rid = NONE;
        !           243:                        }
        !           244:                ;
        !           245: 
        !           246: ANYPARAMS      :       /* empty */
        !           247:                |       PNAMELIST
        !           248:                |       error
        !           249:                        {       yyerror("bad namelist", "");
        !           250:                        }
        !           251: 
        !           252:                ;
        !           253: 
        !           254: ANYPARTYPES    :       /* empty */
        !           255:                |       PARTYPES
        !           256:                |       error
        !           257:                        {       yyerror("bad parameterlist", "");
        !           258:                        }
        !           259:                ;
        !           260: 
        !           261: PARTYPES       :       ONEPARTYPE SEMICOLON
        !           262:                |       PARTYPES ONEPARTYPE SEMICOLON
        !           263:                ;
        !           264: ONEPARTYPE     :       PVAR
        !           265:                        {       vartype = ISV;
        !           266:                        }
        !           267:                        PNAMELIST
        !           268:                |       QSET NAME PBEGIN NAME COLON
        !           269:                        {       strcpy(qsetname, strings[$2]);
        !           270:                                sid = newqset(strings[$2], strings[$4], DCL, NONE);
        !           271:                                qid = addFpar(rid, strings[$2], sid, ISQ, inside);
        !           272:                                vartype = ISM;
        !           273:                        }
        !           274:                        PNAMELIST END
        !           275:                        {       qid = NONE;
        !           276:                                closeqset(sid);
        !           277:                        }
        !           278:                ;
        !           279: /*
        !           280:  *     REQUIREMENTS
        !           281:  *     ============
        !           282:  */
        !           283: REQUIREMENT    :       ASSERT
        !           284:                        PBEGIN
        !           285:                        {       rid = newreftask(" assert", DCL);
        !           286:                                assertion = rid;
        !           287:                                curstate = enterowname(NEW, "", DAR);
        !           288:                                strcpy(refname, " assert");
        !           289:                                newcalltable();
        !           290:                        }
        !           291:                        _SEQUENCE
        !           292:                        END
        !           293:                        {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           294:                                strcpy(refname, "_");
        !           295:                                rid = NONE;
        !           296:                                lastloop = -1;
        !           297:                        }
        !           298:                |       ERROR
        !           299:                        PBEGIN
        !           300:                        {       rid = newreftask(" error", DCL);
        !           301:                                inertion = rid;
        !           302:                                curstate = enterowname(NEW, "", DAR);
        !           303:                                strcpy(refname, " error");
        !           304:                                newcalltable();
        !           305:                        }
        !           306:                        _SEQUENCE
        !           307:                        END
        !           308:                        {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           309:                                strcpy(refname, "_");
        !           310:                                rid = NONE;
        !           311:                                lastloop = -1;
        !           312:                        }
        !           313:                ;
        !           314: _SEQUENCE      :       _STMNT
        !           315:                |       _SEQUENCE SEPARATOR _STMNT
        !           316:                ;
        !           317: 
        !           318: _STMNT         :       skip            { lastloop = -1; }
        !           319:                |       _SELECT         { lastloop = -1; }
        !           320:                |       _CYCLE
        !           321:                |       SEND            { lastloop = -1; }
        !           322:                |       GUARD           { lastloop = -1; }
        !           323:                |       STRUCTGOTO      { lastloop = -1; }
        !           324:                |       error
        !           325:                        {       yyerror("illegal assertion statement, %s", yytext);
        !           326:                        }
        !           327:                ;
        !           328: _SELECT                :       IF
        !           329:                        {       if (++curdepth == MAXDEPTH)
        !           330:                                        whoops("nesting too deep");
        !           331: 
        !           332:                                ties[curdepth].home = curstate;
        !           333:                                ties[curdepth].dest = enterowname(NEW, "", DAR);
        !           334:                                ties[curdepth].bpnt =
        !           335:                                        (curdepth > 1) ? ties[curdepth-1].bpnt : -1;
        !           336:                        }
        !           337:                        _OPTIONLIST FI
        !           338:                        {       setrowname(ties[curdepth].dest);
        !           339:                                curstate = ties[curdepth--].dest;
        !           340:                        }
        !           341:                ;
        !           342: 
        !           343: _CYCLE         :       DO
        !           344:                        {       if (curdepth++ == MAXDEPTH)
        !           345:                                        whoops("nesting too deep");
        !           346: 
        !           347:                                labelrow(curstate);
        !           348:                                ties[curdepth].home = curstate;
        !           349:                                ties[curdepth].dest = curstate;
        !           350:                                ties[curdepth].bpnt = enterowname(NEW, "", DAR);
        !           351:                        }
        !           352:                        _OPTIONLIST OD
        !           353:                        {       lastloop = ties[curdepth].home;
        !           354:                                setrowname(ties[curdepth].bpnt);
        !           355:                                curstate = ties[curdepth--].bpnt;
        !           356:                        }
        !           357:                ;
        !           358: _OPTIONLIST    :       _ONEOPTION
        !           359:                |       _ONEOPTION _OPTIONLIST
        !           360:                ;
        !           361: 
        !           362: _ONEOPTION     :       FLAG _SEQUENCE
        !           363:                        {       getrowname(str, ties[curdepth].dest);
        !           364:                                from = curstate;
        !           365:                                curstate = enterowname(OLD, str, DAR);
        !           366:                                setrans(from, 0, curstate, NONE);
        !           367:                                curstate = ties[curdepth].home;
        !           368:                        }
        !           369:                ;
        !           370: /*
        !           371:  *     NAMELISTS
        !           372:  *     =========
        !           373:  */
        !           374: 
        !           375: ANAMELIST      :       ANAME
        !           376:                |       ANAMELIST ',' ANAME
        !           377:                ;
        !           378: MNAMELIST      :       MNAME
        !           379:                |       MNAMELIST ',' MNAME
        !           380:                ;
        !           381: PNAMELIST      :       PNAME
        !           382:                |       PNAMELIST ',' PNAME
        !           383:                ;
        !           384: QNAMELIST      :       QNAME
        !           385:                |       QNAMELIST ',' QNAME
        !           386:                ;
        !           387: SNAMELIST      :       SNAME
        !           388:                |       SNAMELIST ',' SNAME
        !           389:                ;
        !           390: VNAMELIST      :       VNAME
        !           391:                |       VNAMELIST ',' VNAME
        !           392:                ;
        !           393: /*
        !           394:  *     NAMES
        !           395:  *     =====
        !           396:  */
        !           397: 
        !           398: ANAME          :       QSNAME { addApars(strings[$1], nid, parnum++, NONE); }
        !           399:                |       expr   { addAspecial(makeexpr($1), nid, parnum++);   }
        !           400:                ;
        !           401: MNAME          :       NAME
        !           402:                        {       qtable[qid].status |= ADR;
        !           403:                                addmsg(strings[$1], qid, SND, INITM, NONE);
        !           404:                                if (--qisz < 0)
        !           405:                                yyerror("queue overfilled, %s", strings[$1]);
        !           406:                        }
        !           407:                ;
        !           408: PNAME          :       NAME
        !           409:                        {       if (vartype == ISM)
        !           410:                                addsetname(strings[$1], sid, 1);
        !           411:                                else
        !           412:                                addFpar(rid, strings[$1], qid, vartype, inside);
        !           413:                        }
        !           414:                ;
        !           415: QNAME          :       NAME '[' VALUE ']'
        !           416:                        {       if ((qisz = $3) <= 0)
        !           417:                                yyerror("illegal queue size, %s", strings[$1]);
        !           418:                                newqname(strings[$1], DCL, $3, NONE);
        !           419:                        }
        !           420:                |       NAME '[' VALUE ']' '[' VALUE ']'
        !           421:                        {       if ((qisz = $6) <= 0)
        !           422:                                yyerror("illegal queue size, %s", strings[$1]);
        !           423:                                newqname(strings[$1], DCL, qisz, $3);
        !           424:                        }
        !           425:                ;
        !           426: SNAME          :       NAME            { addsetname(strings[$1], sid, 0); }
        !           427:                ;
        !           428: VNAME          :       NAME QINDEX
        !           429:                        {       addvarname(strings[$1], DCL, NONE, $2, 0);
        !           430:                        }
        !           431:                |       NAME QINDEX '=' expr
        !           432:                        {       addvarname(strings[$1], DCL, makeexpr($4), $2, 0);
        !           433:                        }
        !           434:                |       NAME QINDEX COLON VALUE
        !           435:                        {       addvarname(strings[$1], DCL, NONE, $2, $4);
        !           436:                        }
        !           437:                ;
        !           438: /*
        !           439:  *     CODE
        !           440:  *     ====
        !           441:  */
        !           442: 
        !           443: SEQUENCE       :       STMNT
        !           444:                        {       soo = 0;
        !           445:                        }
        !           446:                |       SEQUENCE SEPARATOR STMNT
        !           447:                        {       soo = 0;
        !           448:                        }
        !           449:                ;
        !           450: 
        !           451: STMNT          :       skip
        !           452:                        {       if (soo)        /* only if used as a guard */
        !           453:                                        transfer(0, NONE);
        !           454:                        }
        !           455:                |       SELECT
        !           456:                |       CYCLE
        !           457:                |       SEND
        !           458:                |       GUARD
        !           459:                |       JUMP
        !           460:                |       LABEL STMNT
        !           461:                |       TEMPLATE
        !           462:                |       BUILTIN
        !           463:                |       CONDITIONAL
        !           464:                |       END
        !           465:                        {       yyerror("expecting a statement", "");
        !           466:                                whoops("exit");
        !           467:                        }
        !           468:                ;
        !           469: 
        !           470: SELECT         :       IF
        !           471:                        {       if (++curdepth == MAXDEPTH)
        !           472:                                        whoops("nesting too deep");
        !           473: 
        !           474:                                ties[curdepth].home = curstate;
        !           475:                                ties[curdepth].dest = enterowname(NEW, "", DAR);
        !           476:                                ties[curdepth].bpnt =
        !           477:                                        (curdepth>1) ? ties[curdepth-1].bpnt : -1;
        !           478:                        }
        !           479:                        OPTIONLIST FI
        !           480:                        {       setrowname(ties[curdepth].dest);
        !           481:                                curstate = ties[curdepth--].dest;
        !           482:                        }
        !           483:                ;
        !           484: 
        !           485: CYCLE          :       DO
        !           486:                        {       if (curdepth++ == MAXDEPTH)
        !           487:                                        whoops("nesting too deep");
        !           488: 
        !           489:                                labelrow(curstate);
        !           490:                                ties[curdepth].home = curstate;
        !           491:                                ties[curdepth].dest = curstate;
        !           492:                                ties[curdepth].bpnt = enterowname(NEW, "", DAR);
        !           493:                        }
        !           494:                        OPTIONLIST OD
        !           495:                        {       setrowname(ties[curdepth].bpnt);
        !           496:                                curstate = ties[curdepth--].bpnt;
        !           497:                        }
        !           498:                ;
        !           499: 
        !           500: OPTIONLIST     :       ONEOPTION
        !           501:                |       ONEOPTION OPTIONLIST
        !           502:                ;
        !           503: 
        !           504: ONEOPTION      :       FLAG
        !           505:                        {       soo = 1;        /* start of an option string */
        !           506:                        }
        !           507:                        SEQUENCE
        !           508:                        {       getrowname(str, ties[curdepth].dest);
        !           509:                                from = curstate;
        !           510:                                curstate = enterowname(OLD, str, DAR);
        !           511:                                setrans(from, 0, curstate, NONE);
        !           512:                                curstate = ties[curdepth].home;
        !           513:                        }
        !           514:                ;
        !           515: 
        !           516: INDEX          :       /* empty */     { $$ = NONE; }
        !           517:                |       '[' expr ']'    { $$ = makeexpr($2); }
        !           518:                ;
        !           519: 
        !           520: PREIO          :       NAME INDEX
        !           521:                        {       strcpy(str, strings[$1]); /* swivel away name */
        !           522:                                $$ = $2;
        !           523:                        }
        !           524:                ;
        !           525: 
        !           526: SEND           :       PREIO NOT NAME EXPORT
        !           527:                        {       xx = newqname(str, ADR, NONE, $1);
        !           528:                                zz = addmsg(strings[$3], xx, SND, NORM, $1);
        !           529:                                n = entercolname(zz, OUTP);
        !           530:                                transfer(n, m);
        !           531:                        }
        !           532:                ;
        !           533: 
        !           534: EXPORT :               /* empty */     { m = NONE; }
        !           535:                |       '(' expr ')'    { m = makeexpr($2); }
        !           536:                ;
        !           537: 
        !           538: GUARD          :       PREIO '?' timeout
        !           539:                        { int x;
        !           540:                                xx = newqname(str, RFR, NONE, $1);
        !           541:                                x = addmsg(" tau", xx, SAR, NORM, $1);
        !           542:                                /*
        !           543:                                ** the leading space is to avoid
        !           544:                                ** clashes with a user name `tau',
        !           545:                                ** e.g. in a formal parameter list
        !           546:                                */
        !           547:                                n = entercolname(x, TMO);
        !           548:                                transfer(n, NONE);
        !           549:                        }
        !           550:                |       PREIO '?' NAME IMPORT
        !           551:                        {       xx = newqname(str, RFR, NONE, $1);
        !           552:                                zz = addmsg(strings[$3], xx, RCV, NORM, $1);
        !           553:                                n = entercolname(zz, INP);
        !           554:                                transfer(n, $4);
        !           555:                        }
        !           556:                |       PREIO '?' DEFAULT IMPORT
        !           557:                        {       xx = newqname(str, RFR, NONE, $1);
        !           558:                                zz = addmsg(" any", xx, SAR, NORM, $1);
        !           559:                                n = entercolname(zz, DFL);
        !           560:                                transfer(n, $4);
        !           561:                        }
        !           562:                ;
        !           563: 
        !           564: IMPORT :               /* empty */
        !           565:                        {       $$ = NONE;
        !           566:                        }
        !           567:                |       '(' ARNAME INDEX ')'
        !           568:                        {       $$ = addvarname(strings[$2], RFR, NONE, $3, 0);
        !           569:                        }
        !           570:                |       '(' NAME ')'
        !           571:                        {       $$ = addvarname(strings[$2], RFR, NONE, NONE, 0);
        !           572:                        }
        !           573:                |       '(' VALUE ')'
        !           574:                        {       yyerror("importing into constant", "");
        !           575:                        }
        !           576:                ;
        !           577:  
        !           578: SEPARATOR      :       ARROW
        !           579:                |       SEMICOLON
        !           580:                |       error
        !           581:                        {       yyerror("expecting a stmnt separator", "");
        !           582:                        }
        !           583:                ;
        !           584: 
        !           585: JUMP           :       GOTO NAME
        !           586:                        {       from = curstate;
        !           587:                                curstate = enterowname(LAB, strings[$2], ADR);
        !           588:                                setrans(from, 0, curstate, NONE);
        !           589:                                curstate = enterowname(NEW, "", DAR);
        !           590:                        }
        !           591:                |       STRUCTGOTO
        !           592:                ;
        !           593: 
        !           594: STRUCTGOTO     :       BREAK
        !           595:                        { int i;
        !           596:                                from = curstate;
        !           597:                                i = ties[curdepth].bpnt;
        !           598: 
        !           599:                                if (curdepth == 0 || i == -1)
        !           600:                                        whoops("illegal break statement");
        !           601: 
        !           602:                                getrowname(str, i);
        !           603:                                curstate = enterowname(OLD, str, DAR);
        !           604:                                setrans(from, 0, curstate, NONE);
        !           605:                                curstate = enterowname(NEW, "", DAR);
        !           606:                        }
        !           607:                ;
        !           608: 
        !           609: TEMPLATE       :       NAME
        !           610:                        {       nid = newreftask(strings[$1], RFR);
        !           611:                                parnum = 0; qid = sid = NONE;
        !           612:                                cid = newcall(nid);
        !           613:                        }
        !           614:                        '(' ANYACTUALS ')'
        !           615:                        { int x;
        !           616:                                parrefs(parnum, nid);
        !           617:                                x = entercolname(cid, FCT);
        !           618:                                transfer(x, NONE);
        !           619:                        }
        !           620:                ;
        !           621: 
        !           622: ANYACTUALS     :       /* empty */
        !           623:                |       ANAMELIST
        !           624:                ;
        !           625: 
        !           626: CONDITIONAL    :       '(' expr ')'
        !           627:                        {       transfer(entercolname(makeexpr($2), CND), NONE);
        !           628:                        }
        !           629:                ;
        !           630: 
        !           631: VARNAME                :       ARNAME INDEX
        !           632:                        {       m = addvarname(strings[$1], RFR, NONE, $2, 0);
        !           633:                                $$ = newnode(NM, m, NULL, NULL);
        !           634:                        }
        !           635:                |       NAME
        !           636:                        {       m = addvarname(strings[$1], RFR, NONE, NONE, 0);
        !           637:                                $$ = newnode(NM, m, NULL, NULL);
        !           638:                        }
        !           639:                ;
        !           640: 
        !           641: BUILTIN                :       VARNAME ASGN expr
        !           642:                        {       m = makeexpr(newnode(OP, $2, $1, $3));
        !           643:                                transfer(0, m);
        !           644:                        }
        !           645:                |       VARNAME INC 
        !           646:                        {       m = makeexpr(newnode(OP, poinc, $1, NULL));
        !           647:                                transfer(0, m);
        !           648:                        }
        !           649:                |       VARNAME DEC
        !           650:                        {       m = makeexpr(newnode(OP, podec, $1, NULL));
        !           651:                                transfer(0, m);
        !           652:                        }
        !           653:                ;
        !           654: 
        !           655: ASGN           :       '='     { $$ =  setv; }
        !           656:                |       ADDEQ   { $$ = addeq; }
        !           657:                |       SUBEQ   { $$ = subeq; }
        !           658:                |       MULEQ   { $$ = muleq; }
        !           659:                |       DIVEQ   { $$ = diveq; }
        !           660:                |       MODEQ   { $$ = modeq; }
        !           661:                ;
        !           662: 
        !           663: expr           :       expr '+' expr { $$ = newnode(OP, plus, $1, $3); }
        !           664:                |       expr '-' expr { $$ = newnode(OP, minus, $1, $3); }
        !           665:                |       expr '*' expr { $$ = newnode(OP, times, $1, $3); }
        !           666:                |       expr '/' expr { $$ = newnode(OP, div, $1, $3); }
        !           667:                |       expr '%' expr { $$ = newnode(OP, mod, $1, $3); }
        !           668:                |       expr '^' expr { $$ = newnode(OP, power, $1, $3); }
        !           669:                |       expr GT expr { $$ = newnode(OP, gt, $1, $3); }
        !           670:                |       expr GE expr { $$ = newnode(OP, ge, $1, $3); }
        !           671:                |       expr LT expr { $$ = newnode(OP, lt, $1, $3); }
        !           672:                |       expr LE expr { $$ = newnode(OP, le, $1, $3); }
        !           673:                |       expr EQ expr { $$ = newnode(OP, eq, $1, $3); }
        !           674:                |       expr NE expr { $$ = newnode(OP, ne, $1, $3); }
        !           675:                |       expr AND expr { $$ = newnode(OP, land, $1, $3); }
        !           676:                |       expr OR expr { $$ = newnode(OP, lor, $1, $3); }
        !           677:                |       '-' expr %prec UNARYMINUS
        !           678:                        {       $$ = newnode(OP, uminus, $2, NULL); }
        !           679:                |       NOT expr
        !           680:                        {       $$ = newnode(OP, lnot, $2, NULL); }
        !           681:                |       VALUE
        !           682:                        {       $$ = newnode(NM, $1+3*MANY, NULL, NULL); }
        !           683:                |       ARNAME INDEX
        !           684:                        {       m = addvarname(strings[$1], RFR, NONE, $2, 0);
        !           685:                                $$ = newnode(NM, m, NULL, NULL);
        !           686:                        }
        !           687:                |       NAME
        !           688:                        {       m = addvarname(strings[$1], RFR, NONE, NONE, 0);
        !           689:                                $$ = newnode(NM, m, NULL, NULL);
        !           690:                        }
        !           691:                |       '(' expr ')' { $$ = $2; }
        !           692:                ;
        !           693: 
        !           694: LABEL          :       NAME COLON
        !           695:                        {       from = curstate;
        !           696:                                curstate = enterowname(LAB, strings[$1], DCL);
        !           697:                                labelrow(curstate);
        !           698:                                setrans(from, 0, curstate, NONE);
        !           699:                        }
        !           700:                ;
        !           701: %%
        !           702: 
        !           703: extern FILE *yyin;
        !           704: 
        !           705: main(argc, argv)
        !           706:        char **argv;
        !           707: {
        !           708:        int base = 1, i = 1;
        !           709:        char c, buff[256];
        !           710:        char outfile[32];
        !           711: 
        !           712:        if (argc > base && argv[1][0] == '-')
        !           713:        {       while ((c = argv[1][i++]) != '\0')
        !           714:                        switch (c) {
        !           715:                        case 's': varwidths = 1; break;
        !           716:                        case 'v': verbose = 1; break;
        !           717:                        case 'n': nopurge = 1; break;
        !           718:                        case 'l': linecode = 1; break;
        !           719:                        default : fprintf(stderr, "usage: pret [-vsnl] file\n");
        !           720:                                  fprintf(stderr, "\tv - verbose\n");
        !           721:                                  fprintf(stderr, "\ts - supertrace format\n");
        !           722:                                  fprintf(stderr, "\tn - no minimization\n");
        !           723:                                  fprintf(stderr, "\tl - enables linecode\n");
        !           724:                                  exit(1);
        !           725:                        }
        !           726:                base++;
        !           727:        }
        !           728:        if (argc <= base)
        !           729:        {       fprintf(stderr, "usage: pret [-vnl] file\n");
        !           730:                exit(1);
        !           731: 
        !           732:        }
        !           733:        if ((tb = fopen("pret.tmp", "w")) == NULL)
        !           734:                whoops("cannot create pret.tmp\n");
        !           735: 
        !           736:        strcpy(procname, "_");
        !           737:        strcpy(refname, "_");
        !           738:        unlink("pret.out");
        !           739:        unlink("pret.err");
        !           740: 
        !           741:        if (argc > base)
        !           742:        {       strcpy(filename, argv[base]);
        !           743: 
        !           744:                mktemp(strcpy(outfile, "/tmp/trans.XXXXXX"));
        !           745:                sprintf(buff, "/lib/cpp %s > %s", filename, outfile);
        !           746: 
        !           747:                if (system(buff))
        !           748:                {       unlink(outfile);
        !           749:                        exit(1);
        !           750:                } else
        !           751:                        if ((yyin = fopen(outfile, "r")) == NULL)
        !           752:                        {       printf("cannot open %s\n", outfile);
        !           753:                                whoops("aborting");
        !           754:                        }
        !           755:                unlink(outfile);
        !           756:        }
        !           757:        parsed = (struct REVPOL *)
        !           758:                Emalloc(EXPRMAX * sizeof(struct REVPOL));
        !           759:        prs = 0;
        !           760: 
        !           761:        yyparse();
        !           762:        prepsorts();
        !           763:        checknames();
        !           764:        fclose(tb);
        !           765:        chatter();
        !           766:        makebin();
        !           767:        exit(0);
        !           768: }
        !           769: 
        !           770: newstring(str)
        !           771:        char *str;
        !           772: {      register int i;
        !           773: 
        !           774:        for (i = 0; i < nnames; i++)
        !           775:                if (strcmp(str, strings[i]) == 0)
        !           776:                        return i;
        !           777:        if (++nnames >= MANY)
        !           778:                yyerror("symbol table overflow, %s", str);
        !           779:        strncpy(strings[i], str, MAXNAME-1);
        !           780:        return i;
        !           781: }

unix.superglobalmegacorp.com

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