Annotation of researchv10no/cmd/pret/pret.y, revision 1.1.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.