Annotation of 43BSD/ingres/source/parser/grammar.y, revision 1.1

1.1     ! root        1: 
        !             2: /*
        !             3: **  GRAMMAR.Y
        !             4: **
        !             5: **     This file contains a grammar for ingres parsing.  It is setup
        !             6: **     for the (7-31-78) version of yacc.
        !             7: **
        !             8: **     Use:
        !             9: **             to use for non-distributed ingres:
        !            10: **                     grep -v "DDD" > grammar.y
        !            11: **
        !            12: **     Trace Flags:
        !            13: **             Grammar.y ~~ 38, 39
        !            14: */
        !            15: 
        !            16: %{
        !            17: /* SCANNER/PARSER GLOBALS & TABLES */
        !            18: # include      <ingres.h>
        !            19: # include      <aux.h>
        !            20: # include      <tree.h>
        !            21: # include      <symbol.h>
        !            22: # include      <pv.h>
        !            23: # include      "parser.h"
        !            24: # include      <sccs.h>
        !            25: # include      <errors.h>
        !            26: 
        !            27: SCCSID(@(#)grammar.y   8.4     3/2/85)
        !            28: 
        !            29: # ifdef                xPTR1
        !            30: # define       YYDEBUG
        !            31: # endif
        !            32: 
        !            33: int                            i;
        !            34: struct atstash                 *aptr;
        !            35: char                           permbuf[3];
        !            36: /* space for two names, their null bytes and the seperator */
        !            37: char                           modbuf[(2 * (MAXNAME + 1)) + 1];
        !            38: static char                    hqmbuf[2];
        !            39: 
        !            40: extern DESC                    Reldesc;
        !            41: extern int                     Opflag;
        !            42: extern QTREE                   *Lastree;
        !            43: extern QTREE                   *Tidnode;
        !            44: extern int                     Rsdmno;
        !            45: extern int                     Resrng;
        !            46: extern int                     Qrymod;
        !            47: extern int                     Permcomd;
        !            48: extern char                    *Trname;
        !            49: extern int                     Qlflag;
        !            50: extern struct atstash          Faketid;
        !            51: extern char                    *Tuple;
        !            52: extern TID                     tid;
        !            53: 
        !            54: # ifdef        DISTRIB
        !            55: extern struct atstash          Fakesid;
        !            56: # endif
        !            57: 
        !            58: extern char                    *Indexname;
        !            59: 
        !            60: extern QTREE                   *tree();
        !            61: extern QTREE                   *tlprepend();
        !            62: extern QTREE                   *addresdom();
        !            63: extern QTREE                   *xdot();
        !            64: extern QTREE                   *norml();
        !            65: extern struct atstash          *attlookup();
        !            66: extern int                     rngent();
        !            67: extern int                     rnglook();
        !            68: extern PARRNG                  Parrng[];
        !            69: extern STRKEEPER               *substring(),*endvals();
        !            70: %}
        !            71: 
        !            72: /* NEW BEGIN-END THINGS */
        !            73: %start         program
        !            74: 
        !            75: /* UNION YYSTYPE DEFINED */
        !            76: %union
        !            77: {
        !            78:        int                             type_type;      /* OPERATOR TYPES ETC. */
        !            79:        QTREE                           *tree_type;
        !            80:        int                             rng_type;
        !            81:        char                            char_type;
        !            82:        int                             int_type;
        !            83:        short                           *I2_type;
        !            84:        long                            *I4_type;
        !            85:        float                           *F4_type;
        !            86:        double                          *F8_type;
        !            87:        char                            *string_type;
        !            88:        STRKEEPER                       *substr_type;
        !            89: }
        !            90: 
        !            91: /* COMMANDS */
        !            92: %token         APPEND  COPY    CREATE  DELETE  DESTROY HELP    INDEX   MODIFY
        !            93: %token         PRINT   RANGE   REPLACE RETRIEVE        SAVE            
        !            94: %token         DEFINE  PERMIT  VIEW    INTEGRITY
        !            95: %token         DELIM   USE     UNUSE
        !            96: /*DDD*/%token  DISTRIBUTE
        !            97: 
        !            98: /* 'NOISE' WORDS */
        !            99: %token         ALL     BY      FROM    IN      INTO    UNIQUE  AT
        !           100: %token         IS      OF      ON      ONTO    TO      UNTIL   WHERE
        !           101: /*DDD*/%token  DISTRD
        !           102: 
        !           103: /* CONSTANTS */
        !           104: %token         NAME    SCONST  I2CONST I4CONST F4CONST F8CONST
        !           105: 
        !           106: /* PUNCTUATION */
        !           107: %token         COMMA   LPAREN  PERIOD  RPAREN  COLON   BGNCMNT ENDCMNT
        !           108: %token         LBRAC   RBRAC   DOLLAR  PCT
        !           109: 
        !           110: /* UNARY ARITHMETIC OPERATORS */
        !           111: %token         UAOP
        !           112: 
        !           113: /* BINARY ARITHMETIC OPERATORS */
        !           114: %token         BAOP    BAOPH
        !           115: 
        !           116: /* BOUNDS OPERATORS */
        !           117: %token         BDOP
        !           118: 
        !           119: /* EQUALITY OPERATORS */
        !           120: %token         EOP
        !           121: 
        !           122: /* LOGICAL OPERATORS */
        !           123: %token         LBOP    LUOP
        !           124: 
        !           125: /* FUNCTIONAL OPERATORS */
        !           126: %token         FOP     FBOP
        !           127: 
        !           128: /* AGGREGATE OPERATORS */
        !           129: %token         AGOP
        !           130: 
        !           131: /* TYPES FOR INGRES TOKENS */
        !           132: %type  <type_type>     IS
        !           133: %type  <string_type>   NAME    SCONST
        !           134: %type  <I2_type>       I2CONST
        !           135: %type  <I4_type>       I4CONST
        !           136: %type  <F4_type>       F4CONST
        !           137: %type  <F8_type>       F8CONST
        !           138: %type  <type_type>     UAOP
        !           139: %type  <type_type>     BAOP    BAOPH
        !           140: %type  <type_type>     BDOP
        !           141: %type  <type_type>     EOP
        !           142: %type  <type_type>     LBOP    LUOP
        !           143: %type  <type_type>     FOP     FBOP
        !           144: %type  <type_type>     AGOP
        !           145: %type   <char_type>    LPAREN  RPAREN  LBRAC   RBRAC  PCT
        !           146: 
        !           147: /* TYPES FOR INGRES NON-TERMINALS */
        !           148: %type  <tree_type>     permtarg        permtlist       permtlelm
        !           149: /*DDD*/%type   <tree_type>     distribute      distcrits       dcriterion
        !           150: %type  <tree_type>     tlclause        tlist   tlelm
        !           151: %type  <tree_type>     qualclause      qual    clause  afcn    aggrfcn
        !           152: %type  <type_type>     relop
        !           153: %type  <tree_type>     domseq  targdom attrib
        !           154: %type  <rng_type>      var
        !           155: %type  <tree_type>     attribfcn
        !           156: %type  <type_type>     uop
        !           157: %type  <string_type>   alias
        !           158: %type   <substr_type>   subelm stringpart      grpelm  nameprt
        !           159: %type  <char_type>     leftclose       rightclose
        !           160: 
        !           161: /* DEFINE ASCENDING PRECEDENCE FOR OPERATORS */
        !           162: %left          LBOP
        !           163: %left          LUOP
        !           164: %left          UAOP
        !           165: %left          BAOP
        !           166: %left          BAOPH
        !           167: %nonassoc      unaryop
        !           168: 
        !           169: %%
        !           170: program:       program stmnt =
        !           171:                {
        !           172: #                      ifdef   xPTR1
        !           173:                        tTfp(38, 0, "*** [program stmnt] parsed.\n");
        !           174: #                      endif
        !           175: 
        !           176:                        if (endquelst(Opflag) < 0)
        !           177:                                return (-1);
        !           178:                }
        !           179:        |       stmnt =
        !           180:                {
        !           181: #                      ifdef   xPTR1
        !           182:                        tTfp(38, 1, "*** [stmnt] parsed.\n");
        !           183: #                      endif
        !           184: 
        !           185:                        if (endquelst(Opflag) < 0)
        !           186:                                return (-1);
        !           187:                }
        !           188:        |
        !           189:                {
        !           190: #                      ifdef   xPTR1
        !           191:                        tTfp(38, 2, "*** [(NULL)] parsed.\n");
        !           192: #                      endif
        !           193:                }
        !           194: ;
        !           195: stmnt:         append
        !           196:        |       copy
        !           197:        |       create
        !           198:        |       delete  
        !           199:        |       destroy
        !           200: /*DDD*/        |       distribute
        !           201:        |       help
        !           202:        |       index   
        !           203:        |       integrity
        !           204:        |       modify
        !           205:        |       permit
        !           206:        |       print
        !           207:        |       range
        !           208:        |       replace 
        !           209:        |       retrieve 
        !           210:        |       save
        !           211:        |       view
        !           212:        |       use
        !           213:        |       unuse
        !           214:        |       delim   
        !           215:        |       error
        !           216:                {
        !           217: #                      ifdef   xPTR1
        !           218:                        tTfp(38, 0, "*** [error] parsed.\n");
        !           219: #                      endif
        !           220:                }
        !           221: 
        !           222: ;
        !           223: range:         rngstmnt OF NAME IS NAME =
        !           224:                {
        !           225:                        if ((i = openr(&Reldesc, OR_RELTID, $5)) < 0)
        !           226:                                syserr("relname: error in openr '%d'", i);
        !           227:                        if (i > 0)
        !           228:                        {
        !           229:                                /* invalid relation name */
        !           230:                                par_error(RNGEXIST, WARN, $5, 0);
        !           231:                                YYERROR;
        !           232:                        }
        !           233:                        else
        !           234:                                rngent(R_EXTERNAL, $3, &Reldesc);
        !           235:                }
        !           236: ;
        !           237: rngstmnt:      RANGE =
        !           238:                {
        !           239:                        Opflag = mdRANGE;
        !           240:                }
        !           241: ;
        !           242: append:                apstmnt apto relation tlclause qualclause =
        !           243:                {
        !           244:                        /* make root node */
        !           245:                        Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1);
        !           246:                }
        !           247: ;
        !           248: apstmnt:       APPEND =
        !           249:                {
        !           250:                        Opflag = mdAPP;
        !           251:                }
        !           252: ;
        !           253: apto:          INTO
        !           254:        |       ONTO
        !           255:        |       TO
        !           256:        |       ON
        !           257:        |       ;
        !           258: ;
        !           259: delete:                delstmnt delwd relation qualclause =
        !           260:                {
        !           261:                        /* make root node for delete, with a TIDNODE at leftmost */
        !           262:                        Lastree = tree(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), NULL), $4, ROOT, sizeof(struct rootnode), 1);
        !           263:                }
        !           264: ;
        !           265: delstmnt:      DELETE =
        !           266:                {
        !           267:                        Opflag = mdDEL;
        !           268:                }
        !           269: ;
        !           270: delwd:         IN
        !           271:        |       ON
        !           272:        |       FROM
        !           273:        |       ;
        !           274: ;
        !           275: replace:       repstmnt repkwd relation tlclause qualclause =
        !           276:                {
        !           277:                        /* make root node for replace */
        !           278:                        Lastree = tree($4, $5, ROOT, sizeof(struct rootnode), 1);
        !           279:                }
        !           280: ;
        !           281: repstmnt:      REPLACE =
        !           282:                {
        !           283:                        Opflag = mdREPL;
        !           284:                }
        !           285: ;
        !           286: repkwd:                INTO
        !           287:        |       IN
        !           288:        |       ON
        !           289:        |       ;
        !           290: ;
        !           291: retrieve:      retstmnt retclause tlclause qualclause =
        !           292:                {
        !           293:                        /* make root node for retrieve */
        !           294:                        Lastree = tree($3, $4, ROOT, sizeof(struct rootnode), 1);
        !           295:                }
        !           296: ;
        !           297: retstmnt:      RETRIEVE =
        !           298:                {
        !           299:                        Opflag = mdRETR;
        !           300:                }
        !           301: ;
        !           302: retclause:     retkwd relation =
        !           303:                {
        !           304:                        /* set up pipe block and save relname for create */
        !           305: #                      ifdef   xPTR2
        !           306:                        tTfp(38, 4, "retclause: Rsdmno %d", Rsdmno);
        !           307: #                      endif
        !           308:                        Rsdmno = 0;
        !           309:                        setp(PV_STR, "0");      /* relstat = nil */
        !           310:                        setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
        !           311:                }
        !           312:        |       =
        !           313:                {
        !           314:                        /* no result relation, output to terminal */
        !           315:                        Rsdmno = 0;
        !           316:                        Resrng = -1;
        !           317:                }
        !           318:        |       UNIQUE =
        !           319:                {
        !           320:                        Opflag = mdRET_UNI;
        !           321:                        Rsdmno = 0;
        !           322:                        Resrng = -1;
        !           323:                }
        !           324: ;
        !           325: retkwd:                INTO
        !           326:        |       TO
        !           327:        |       ;
        !           328: ;
        !           329: 
        !           330: delim:         DEFINE DELIM NAME LPAREN NAME COMMA SCONST RPAREN = 
        !           331:                {
        !           332:                        Opflag = mdSTOP;
        !           333:                        if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0)
        !           334:                                syserr("relname: error in openr '%d'", i);
        !           335:                        if (i > 0)
        !           336:                        {
        !           337:                                /* invalid relation name */
        !           338:                                par_error(RNGEXIST, WARN, "rdelim", 0);
        !           339:                                YYERROR;
        !           340:                        }
        !           341:                        else
        !           342:                        {
        !           343:                                if (( i = make_tuples(&Reldesc, $3, $5, $7)) < 0)
        !           344:                                {
        !           345:                                        closer(&Reldesc);
        !           346:                                        par_error(BADBNF, WARN, "rdelim", 0);
        !           347:                                }
        !           348:                        }
        !           349:                        closer(&Reldesc);
        !           350:                }
        !           351: ;
        !           352: use:           USE NAME =
        !           353:                {
        !           354:                        Opflag = mdSTOP;
        !           355:                        if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0)
        !           356:                                syserr("relname: error in openr '%d'", i);
        !           357:                        if (i > 0)
        !           358:                        {
        !           359:                                /* invalid relation name */
        !           360:                                par_error(RNGEXIST, WARN, "rdelim", 0);
        !           361:                                YYERROR;
        !           362:                        }
        !           363:                        else
        !           364:                        {
        !           365:                                if ((i = make_list(&Reldesc, $2)) < 0)
        !           366:                                {
        !           367:                                        closer(&Reldesc);
        !           368:                                        par_error(DELEXIST, WARN, 0);
        !           369:                                }
        !           370:                        }
        !           371:                        closer(&Reldesc);
        !           372:                }
        !           373: ;
        !           374: unuse:         UNUSE NAME =
        !           375:                {
        !           376:                        Opflag = mdSTOP;
        !           377:                        if ( i = shrink_list($2) < 0)
        !           378:                        {
        !           379:                                par_error(NOGRP,WARN,0);
        !           380:                        }
        !           381:                }
        !           382: ;
        !           383: 
        !           384: view:          viewclause tlclause qualclause =
        !           385:                {
        !           386:                        Lastree = tree($2, $3, ROOT, sizeof(struct rootnode), 1);
        !           387:                }
        !           388: ;
        !           389: viewclause:    viewstmnt relation =
        !           390:                {
        !           391:                        Rsdmno = 0;
        !           392:                        setp(PV_STR, "0040");   /* relstat = S_VIEW */
        !           393:                        setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
        !           394:                }
        !           395: ;
        !           396: viewstmnt:     DEFINE VIEW =
        !           397:                {
        !           398:                        Opflag = mdVIEW;
        !           399:                        if (!Qrymod)
        !           400:                        {
        !           401:                                /* no qrymod in database */
        !           402:                                par_error(NOQRYMOD, WARN, 0);
        !           403:                        }
        !           404:                }
        !           405: ;
        !           406: permit:                permstmnt permlist permrel permtarg permwho permplace permtd qualclause =
        !           407:                {
        !           408:                        Lastree = tree($4, $8, ROOT, sizeof(struct rootnode), 1);
        !           409:                }
        !           410: ;
        !           411: permstmnt:     DEFINE PERMIT =
        !           412:                {
        !           413:                        Opflag = mdPROT;
        !           414:                        if (!Qrymod)
        !           415:                        {
        !           416:                                /* no qrymod in database */
        !           417:                                par_error(NOQRYMOD, WARN, 0);
        !           418:                        }
        !           419:                }
        !           420: ;
        !           421: permlist:      permxlist
        !           422:        |       permlist COMMA permxlist
        !           423: ;
        !           424: permxlist:     ALL =
        !           425:                {
        !           426:                        permcom(-1);    /* means 'all' commands */
        !           427:                }
        !           428:        |       RETRIEVE =
        !           429:                {
        !           430:                        permcom(mdRETR);
        !           431:                }
        !           432:        |       DELETE =
        !           433:                {
        !           434:                        permcom(mdDEL);
        !           435:                }
        !           436:        |       APPEND =
        !           437:                {
        !           438:                        permcom(mdAPP);
        !           439:                }
        !           440:        |       REPLACE =
        !           441:                {
        !           442:                        permcom(mdREPL);
        !           443:                }
        !           444: ;
        !           445: permrel:       permword relation =
        !           446:                {
        !           447:                        /* put command vector into list now since this always happens */
        !           448:                        setp(PV_INT, Permcomd);
        !           449:                        Permcomd = 0;           /* reset command map */
        !           450:                        setp(PV_STR, trim_relname(Parrng[Resrng].vardesc.reldum.relid));
        !           451:                        bmove(Parrng[Resrng].vardesc.reldum.relowner, permbuf, 2);
        !           452:                        permbuf[2] = 0;
        !           453:                        setp(PV_STR, permbuf);
        !           454:                }
        !           455: ;
        !           456: permword:      ON
        !           457:        |       OF
        !           458:        |       TO
        !           459: ;
        !           460: permtarg:      LPAREN permtlist RPAREN =
        !           461:                {
        !           462:                        $$ = $2;
        !           463:                }
        !           464:        |       =
        !           465:                {
        !           466:                        $$ = NULL;
        !           467:                }
        !           468: ;
        !           469: permtlist:     permtlelm
        !           470:        |       permtlist COMMA permtlelm =
        !           471:                {
        !           472:                        /*
        !           473:                        ** attach bulk of permit tl to leftmost node of new elem
        !           474:                        */
        !           475:                        if (!Err_current)
        !           476:                                $$ = tlprepend($1, $3);
        !           477:                }
        !           478: ;
        !           479: permtlelm:     NAME =
        !           480:                {
        !           481:                        /* Resrng is set by the "relation" production */
        !           482:                        if (!Err_current)
        !           483:                        {
        !           484:                                Trname = $1;
        !           485:                                aptr = attlookup(Resrng, Trname);
        !           486:                                $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, aptr);
        !           487:                                $$ = addresdom(NULL, $$);
        !           488:                        }
        !           489:                }
        !           490: ;
        !           491: permwho:       TO NAME =
        !           492:                {
        !           493:                        setp(PV_STR, $2);
        !           494:                }
        !           495:        |       TO ALL =
        !           496:                {
        !           497:                        setp(PV_STR, "all");
        !           498:                }
        !           499: ;
        !           500: permplace:     AT NAME =
        !           501:                {
        !           502:                        setp(PV_STR, $2);
        !           503:                }
        !           504:        |       AT ALL =
        !           505:                {
        !           506:                        setp(PV_STR, "all");
        !           507:                }
        !           508:        |       =
        !           509:                {
        !           510:                        setp(PV_STR, "all");            /* default is all */
        !           511:                }
        !           512: ;
        !           513: permtd:                permtime permday
        !           514:        |       permdeftime permday
        !           515:        |       permtime permdefday
        !           516:        |       permdeftime permdefday
        !           517: ;
        !           518: permdeftime:   =
        !           519:                {
        !           520:                        setp(PV_INT, 0);
        !           521:                        setp(PV_INT, 1440);
        !           522:                }
        !           523: ;
        !           524: permdefday:    =
        !           525:                {
        !           526:                        setp(PV_STR, "sun");
        !           527:                        setp(PV_STR, "sat");
        !           528:                }
        !           529: ;
        !           530: permtime:      FROM I2CONST COLON I2CONST TO I2CONST COLON I2CONST =
        !           531:                {
        !           532:                        setp(PV_INT, timeofday($2, $4));
        !           533:                        setp(PV_INT, timeofday($6, $8));
        !           534:                }
        !           535: ;
        !           536: permday:       ON NAME TO NAME =
        !           537:                {
        !           538:                        setp(PV_STR, $2);
        !           539:                        setp(PV_STR, $4);
        !           540:                }
        !           541: ;
        !           542: integrity:     integstmnt integnoise relation integis qual =
        !           543:                {
        !           544:                        Lastree = tree(NULL, norml($5), ROOT, sizeof(struct rootnode), 1);
        !           545:                        Qlflag--;       /* turn off here */
        !           546:                }
        !           547: ;
        !           548: integstmnt:    DEFINE INTEGRITY =
        !           549:                {
        !           550:                        Opflag = mdINTEG;
        !           551:                        Qlflag++;       /* OK to turn on here because integrity doesn't have a targ list */
        !           552:                        if (!Qrymod)
        !           553:                        {
        !           554:                                /* no qrymod in database */
        !           555:                                par_error(NOQRYMOD, WARN, 0);
        !           556:                        }
        !           557:                }
        !           558: ;
        !           559: integnoise:    ON
        !           560:        |       ONTO
        !           561:        |       IN
        !           562:        |       OF
        !           563:        |       /* null */
        !           564: ;
        !           565: integis:       IS
        !           566:        |       /* null*/
        !           567: ;
        !           568: /*DDD*/distribute:     diststmnt relation AT distcrits =
        !           569: /*DDD*/                {
        !           570: /*DDD*/                        if (!Err_current)
        !           571: /*DDD*/                        {
        !           572: /*DDD*/                                $$ = tree(NULL, NULL, QLEND, 0);
        !           573: /*DDD*/                                Lastree = tree($4, $$, ROOT, sizeof(struct rootnode), 1);
        !           574: /*DDD*/                        }
        !           575: /*DDD*/                }
        !           576: /*DDD*/;
        !           577: /*DDD*/diststmnt:      DISTRIBUTE =
        !           578: /*DDD*/                                Opflag = mdDISTRIB;
        !           579: /*DDD*/;
        !           580: /*DDD*/distcrits:      dcriterion =
        !           581: /*DDD*/                {
        !           582: /*DDD*/                        $$ = $1;
        !           583: /*DDD*/                }
        !           584: /*DDD*/        |       distcrits dcriterion =
        !           585: /*DDD*/                {
        !           586: /*DDD*/                        $$ = tlprepend($1, $2);
        !           587: /*DDD*/                }
        !           588: /*DDD*/;
        !           589: /*DDD*/dcriterion:     NAME where qual =
        !           590: /*DDD*/                {
        !           591: /*DDD*/                        Qlflag--;
        !           592: /*DDD*/                        syserr("Warning this node may be the wrong size\n");
        !           593: /*DDD*/                        if (!Err_current)
        !           594: /*DDD*/                                $$ = tree(NULL, norml($3), SITE, 2, $1);
        !           595: /*DDD*/                }
        !           596: /*DDD*/;
        !           597: relation:      NAME =
        !           598:                {
        !           599: #                      ifdef   xPTR2
        !           600:                        tTfp(38, 3, "res rel name/var: '%s'\n", $1);
        !           601: #                      endif
        !           602:                        switch (Opflag)
        !           603:                        {
        !           604:                          case mdRETR:
        !           605:                          case mdVIEW:
        !           606:                                /* result better not be a rel name */
        !           607:                                if ((i = openr(&Reldesc, OR_RELTID, $1)) < 0)
        !           608:                                        syserr("relation: err openr '%d'", i);
        !           609:                                if (i == 0)
        !           610:                                {
        !           611:                                        /* reln exists */
        !           612:                                        if (bequal(Reldesc.reldum.relowner, Usercode, UCODE_SZ))
        !           613:                                        {
        !           614:                                                /* same owner, can't duplicate name */
        !           615:                                                par_error(RESEXIST, WARN, $1, 0);
        !           616:                                                YYERROR;
        !           617:                                        }
        !           618:                                        else if (!Err_current)
        !           619:                                        {
        !           620:                                                /* owned by dba -- purge range table */
        !           621:                                                rngdel($1);
        !           622:                                        }
        !           623:                                }
        !           624:                                if (!Err_current)
        !           625:                                {
        !           626:                                        bmove(Usercode, Reldesc.reldum.relowner, UCODE_SZ);
        !           627:                                        pmove($1, Reldesc.reldum.relid, MAXNAME, ' ');
        !           628:                                        Resrng = rngent(R_INTERNAL, "", &Reldesc);
        !           629:                                }
        !           630:                                break;
        !           631: 
        !           632:                          case mdAPP:
        !           633:                                /* result is a rel name */
        !           634:                                if (!Err_current)
        !           635:                                {
        !           636:                                        Resrng = rnglook($1, LOOKREL);
        !           637:                                        if (Resrng < 0)
        !           638:                                        {
        !           639:                                                if ((i = openr(&Reldesc, OR_RELTID, $1)) < 0)
        !           640:                                                        syserr("relation: err openr '%d'", i);
        !           641:                                                if (i)
        !           642:                                                {
        !           643:                                                        /* invalid relation name */
        !           644:                                                        par_error(RESAPPEX, WARN, $1, 0);
        !           645:                                                        YYERROR;
        !           646:                                                }
        !           647:                                                Resrng = rngent(R_INTERNAL, "", &Reldesc);
        !           648:                                        }
        !           649:                                        else
        !           650:                                                ctlmod_decl(Resrng);
        !           651:                                        checkupd(Resrng);
        !           652:                                }
        !           653:                                break;
        !           654: 
        !           655:                          case mdPROT:
        !           656:                          case mdINTEG:
        !           657: #                        ifdef DISTRIB
        !           658:                          case mdDISTRIB:
        !           659: #                        endif
        !           660:                                /* the result is a tuple variable */
        !           661:                                Resrng = rnglook($1, LOOKVAR);
        !           662:                                if (Resrng < 0)
        !           663:                                {
        !           664:                                        /* variable not declared */
        !           665:                                        par_error(NOVBLE, WARN, $1, 0);
        !           666:                                        YYERROR;
        !           667:                                }
        !           668:                                else
        !           669:                                        ctlmod_decl(Resrng);
        !           670:                                break;
        !           671: 
        !           672:                          case mdREPL:
        !           673:                          case mdDEL:
        !           674:                                /* the result is a tuple variable */
        !           675:                                Resrng = rnglook($1, LOOKVAR);
        !           676:                                if (Resrng < 0)
        !           677:                                        /* variable not declared */
        !           678:                                {
        !           679:                                        par_error(NOVBLE, WARN, $1, 0);
        !           680:                                        YYERROR;
        !           681:                                }
        !           682:                                else
        !           683:                                        ctlmod_decl(Resrng);
        !           684: 
        !           685:                                checkupd(Resrng);
        !           686:                                Tidnode = tree(NULL, NULL, VAR, sizeof(struct varnode), Resrng, &Faketid);
        !           687:                                break;
        !           688:                          default:
        !           689:                            ;
        !           690:                        }
        !           691:                }
        !           692: ;
        !           693: tlclause:      LPAREN tlist RPAREN =
        !           694:                {
        !           695:                        $$ = $2;
        !           696: 
        !           697:                        /*
        !           698:                        ** replace must have tid node as left branch
        !           699:                        **      (so does delete but it doesn't have a targ list)
        !           700:                        */
        !           701:                        if (Opflag == mdREPL && !Err_current)
        !           702:                        {
        !           703:                                $$ = tlprepend(tree(NULL, Tidnode, RESDOM, sizeof(struct resdomnode), 0), $$);
        !           704:                        }
        !           705:                }
        !           706: ;
        !           707: tlist:         tlelm
        !           708:        |       tlist COMMA tlelm =
        !           709:                {
        !           710:                        /*
        !           711:                        ** attach bulk of targ list to leftmost node
        !           712:                        ** of new element
        !           713:                        */
        !           714:                        if (!Err_current)
        !           715:                                $$ = tlprepend($1, $3);
        !           716:                }
        !           717: ;
        !           718: tlelm:         NAME is afcn =
        !           719:                {
        !           720:                        Trname = $1;
        !           721:                        /* make a new resdom entry for targ list */
        !           722:                        if (!Err_current)
        !           723:                                $$ = addresdom(NULL, $3);
        !           724:                }
        !           725:        |       attrib =
        !           726:                {
        !           727:                /* makes a new resdom entry for targ list */
        !           728:                        if (!Err_current)
        !           729:                                $$ = addresdom(NULL, $1);
        !           730:                }
        !           731:        |       var PERIOD ALL =
        !           732:                {
        !           733:                        if (Opflag == mdREPL)
        !           734:                        {
        !           735:                                /* ALL not defined for REPLACE */
        !           736:                                par_error(REPALL, WARN,
        !           737:                                    trim_relname(Qt.qt_rangev[$1].rngvdesc->relvname), 0);
        !           738:                                YYERROR;
        !           739:                        }
        !           740:                        /* makes set of new resdom entries for targ list */
        !           741:                        else if (!Err_current)
        !           742:                                $$ = xdot($1);
        !           743:                }
        !           744: ;
        !           745: is:            IS
        !           746:        |       BY
        !           747: ;
        !           748: qualclause:    where qual =
        !           749:                {
        !           750:                        $$ = norml($2);
        !           751:                        Qlflag--;
        !           752:                        if (Opflag == mdREPL)
        !           753:                            qualindex();
        !           754:                }
        !           755:        |       =
        !           756:                {
        !           757:                        /* null qualification */
        !           758:                        if (Opflag == mdREPL)
        !           759:                            qualindex();
        !           760:                        $$ = norml(NULL);
        !           761:                }
        !           762: ;
        !           763: where:         WHERE =
        !           764:                {
        !           765:                        Qlflag++;
        !           766:                }
        !           767: ;
        !           768: qual:          LPAREN qual RPAREN =
        !           769:                {
        !           770:                        $$ = $2;
        !           771:                }
        !           772:        |       LUOP qual =
        !           773:                {
        !           774:                        $$ = tree(NULL, $2, UOP, 2, $1);
        !           775:                }
        !           776:        |       qual LBOP qual =
        !           777:                {
        !           778:                        $$ = tree($1, $3, $2, sizeof (struct rootnode) -2, 0);
        !           779:                }
        !           780:        |       clause
        !           781: ;
        !           782: clause:                afcn relop afcn =
        !           783:                {
        !           784:                        $$ = tree($1, $3, BOP, 2, $2);
        !           785:                }
        !           786: ;
        !           787: relop:         EOP
        !           788:        |       IS
        !           789:        |       BDOP
        !           790: ;
        !           791: afcn:          aggrfcn
        !           792:        |       attribfcn
        !           793:        |       afcn BAOPH afcn =
        !           794:                {
        !           795:                        $$ = tree($1, $3, BOP, 2, $2);
        !           796:                }
        !           797:        |       afcn BAOP afcn =
        !           798:                {
        !           799:                        $$ = tree($1, $3, BOP, 2, $2);
        !           800:                }
        !           801:        |       afcn UAOP afcn =
        !           802:                {
        !           803:                        $$ = tree($1, $3, BOP, 2, $2);
        !           804:                }
        !           805:        |       LPAREN afcn RPAREN =
        !           806:                {
        !           807:                        $$ = $2;
        !           808:                }
        !           809:        |       uop afcn        %prec unaryop   =
        !           810:                {
        !           811:                        $$ = tree(NULL, $2, UOP, 2, $1);
        !           812:                }
        !           813:        |       FOP LPAREN afcn RPAREN =
        !           814:                {
        !           815:                        $$ = tree($3, NULL, UOP, 2, $1);
        !           816:                }
        !           817:        |       FBOP LPAREN afcn COMMA afcn RPAREN =
        !           818:                {
        !           819:                        $$ = tree($3, $5, BOP, 2, $1);
        !           820:                }
        !           821: ;
        !           822: aggrfcn:       AGOP LPAREN afcn BY domseq qualclause RPAREN =
        !           823:                {
        !           824: #                      ifdef   xPTR2
        !           825:                        tTfp(39, 0, "agg func\n");
        !           826: #                      endif
        !           827:                        windup($5);
        !           828:                        $$ = tree(tree($5, tree(NULL, $3, AOP, 6, $1), BYHEAD, sizeof(struct resdomnode), 0), $6, AGHEAD, sizeof(struct rootnode), 0);
        !           829:                        tlprepend(tree(NULL, NULL, TREE, 0), $$);
        !           830:                }
        !           831:        |       AGOP LPAREN afcn qualclause RPAREN =
        !           832:                {
        !           833:                        $$ = tree(tree(NULL, $3, AOP, 6, $1), $4,  AGHEAD, sizeof(struct rootnode), 0);
        !           834:                }
        !           835: ;
        !           836: domseq:                targdom
        !           837:        |       domseq COMMA targdom =
        !           838:                {
        !           839:                        $$ = tlprepend($1, $3);
        !           840:                }
        !           841: ;
        !           842: targdom:       afcn =
        !           843:                {
        !           844:                        $$ = tree(NULL, $1, RESDOM, sizeof(struct resdomnode), Rsdmno);
        !           845:                }
        !           846: ;
        !           847: nameprt:       NAME =
        !           848:                {
        !           849:                        $$ = substring($1,1);
        !           850:                }
        !           851:        |       SCONST =
        !           852:                {
        !           853:                        $$ = substring($1,0);
        !           854:                }
        !           855: ;
        !           856: subelm:                DOLLAR =
        !           857:                { 
        !           858:                        $$ = substring(NULL,0);
        !           859:                }
        !           860:        |       nameprt DOLLAR =
        !           861:                {
        !           862:                        $1->flag[0] |= 2;
        !           863:                        $$ = $1;
        !           864:                }
        !           865:        |       nameprt =
        !           866:                {
        !           867:                        $$ = $1;
        !           868:                }
        !           869:        |       I2CONST subelm =
        !           870:                {
        !           871:                        setnumber($2,$1);
        !           872:                        $$ = $2;
        !           873:                }
        !           874: ;
        !           875: grpelm:                subelm COMMA subelm =
        !           876:                {
        !           877:                        groupstrings($1,$3);
        !           878:                        $$ = $1;
        !           879:                }       
        !           880: ;
        !           881: leftclose:     PCT =
        !           882:                {
        !           883:                        $$ = $1;
        !           884:                }
        !           885:        |       LPAREN =
        !           886:                {
        !           887:                        $$ = $1;
        !           888:                }
        !           889: ;
        !           890: rightclose:    PCT =
        !           891:                {
        !           892:                        $$ = $1;
        !           893:                }
        !           894:        |       RPAREN =
        !           895:                {
        !           896:                        $$ = $1;
        !           897:                }
        !           898: ;
        !           899: stringpart:    leftclose subelm rightclose =
        !           900:                {
        !           901:                        $$ = endvals($2,$1,$3);
        !           902:                }
        !           903:        |       leftclose grpelm rightclose =
        !           904:                {
        !           905:                        $$ = endvals($2,$1,$3);
        !           906:                }
        !           907: ;
        !           908: attrib:                var PERIOD NAME =
        !           909:                {
        !           910: #                      ifdef   xPTR2
        !           911:                        tTfp(39, 1, "attrib %12s.%12s found\n",
        !           912:                        Qt.qt_rangev[$1].rngvdesc->relvname, $3);
        !           913: #                      endif
        !           914: 
        !           915:                        /* remember attribute name */
        !           916:                        Trname = $3;
        !           917: 
        !           918:                        /* look up attribute */
        !           919:                        aptr = attlookup($1, Trname);
        !           920:                        $$ = tree(NULL, NULL, VAR, sizeof(struct varnode), $1, aptr);
        !           921:                }
        !           922:        |       attrib stringpart =
        !           923:                {
        !           924:                        $1->sym.value.sym_var.varstr = $2;
        !           925:                        $$ = $1;
        !           926:                }
        !           927: ;
        !           928: var:           NAME =
        !           929:                {
        !           930:                        $$ = rnglook($1, LOOKVAR);
        !           931:                        if ($$ < 0)
        !           932:                        {
        !           933:                                /* variable not declared */
        !           934:                                par_error(NOVBLE, WARN, $1, 0);
        !           935:                                YYERROR;
        !           936:                        }
        !           937:                        else
        !           938:                                ctlmod_decl($$);
        !           939:                }
        !           940: ;
        !           941: attribfcn:     I2CONST =
        !           942:                {
        !           943:                        $$ = tree(NULL, NULL, INT, 2, $1);
        !           944:                }
        !           945:        |       I4CONST =
        !           946:                {
        !           947:                        $$ = tree(NULL, NULL, INT, 4, $1);
        !           948:                }
        !           949:        |       F4CONST =
        !           950:                {
        !           951:                        $$ = tree(NULL, NULL, FLOAT, 4, $1);
        !           952:                }
        !           953:        |       F8CONST =
        !           954:                {
        !           955:                        $$ = tree(NULL, NULL, FLOAT, 8, $1);
        !           956:                }
        !           957:        |       SCONST =
        !           958:                {
        !           959:                        patmat($1);
        !           960:                        $$ = tree(NULL, NULL, CHAR, length($1), $1);
        !           961:                }
        !           962:        |       NAME =
        !           963:                {
        !           964:                        $$ = tree(NULL, NULL, COP, 2, $1);
        !           965:                }
        !           966:        |       attrib
        !           967: ;
        !           968: uop:           UAOP    %prec unaryop   =
        !           969:                {
        !           970:                        if ($1 == opADD)
        !           971:                                $$ = opPLUS;
        !           972:                        else
        !           973:                                if ($1 == opSUB)
        !           974:                                        $$ = opMINUS;
        !           975:                }
        !           976: ;
        !           977: copy:          copstmnt alias LPAREN coparam RPAREN keywd SCONST =
        !           978:                {
        !           979: #                      ifdef   xPTR2
        !           980:                        tTfp(39, 3, "copy %12s,%12s\n", $2, $7);
        !           981: #                      endif
        !           982: 
        !           983:                        setp(PV_STR, $7);
        !           984:                }
        !           985: ;
        !           986: copstmnt:      COPY =
        !           987:                {
        !           988:                        Opflag = mdCOPY;
        !           989:                }
        !           990: ;
        !           991: coparam:       cospecs
        !           992:        |       ;
        !           993: ;
        !           994: cospecs:       alias is coent
        !           995:        |       cospecs COMMA alias is coent
        !           996: ;
        !           997: coent:         alias
        !           998:        |       SCONST =
        !           999:                {
        !          1000:                        setp(PV_STR, $1);
        !          1001:                }
        !          1002: ;
        !          1003: alias:         NAME =
        !          1004:                {
        !          1005:                        if (!Err_current)
        !          1006:                        {
        !          1007:                                setp(PV_STR, $1);
        !          1008:                                if (Opflag == mdDESTROY || Opflag == mdCREATE
        !          1009: #                                      ifdef   DISTRIB
        !          1010:                                        || Opflag == mdDCREATE
        !          1011: #                                      endif
        !          1012:                                                                )
        !          1013:                                        rngdel($1);
        !          1014:                        }
        !          1015:                }
        !          1016: ;
        !          1017: specs:         alias is alias
        !          1018:        |       specs COMMA alias is alias
        !          1019: ;
        !          1020: keywd:         INTO =
        !          1021:                {
        !          1022:                        setp(PV_STR, "\0");
        !          1023:                        setp(PV_STR, "i");
        !          1024:                }
        !          1025:        |       FROM =
        !          1026:                {
        !          1027:                        setp(PV_STR, "\0");
        !          1028:                        setp(PV_STR, "f");
        !          1029:                }
        !          1030: ;
        !          1031: create:                crestmnt alias LPAREN specs RPAREN
        !          1032: ;
        !          1033: crestmnt:      CREATE =
        !          1034:                {
        !          1035:                        Opflag = mdCREATE;
        !          1036: 
        !          1037:                        /* set up parameters for regular create */
        !          1038:                        setp(PV_STR, "0");              /* relstat = nil */
        !          1039:                }
        !          1040: /*DDD*/        |       CREATE DISTRD =
        !          1041: /*DDD*/                {
        !          1042: /*DDD*/                        Opflag = mdDCREATE;
        !          1043: /*DDD*/
        !          1044: /*DDD*/                        /* setup parameters for distributed create */
        !          1045: /*DDD*/                        setp(PV_STR, "U");
        !          1046: /*DDD*/                        setp(PV_STR, "");
        !          1047: /*DDD*/                        setp(PV_STR, "01000");  /* relstat = S_DISTRIBUTED */
        !          1048: /*DDD*/                }
        !          1049: ;
        !          1050: destroy:       destmnt keys
        !          1051:        |       destqm destlist
        !          1052:        |       destmnt DELIM NAME =
        !          1053:                {
        !          1054:                        Opflag = mdSTOP;
        !          1055:                        if ((i = openr(&Reldesc, OR_WRITE, "rdelim")) < 0)
        !          1056:                                syserr("relname: error in openr '%d'", i);
        !          1057:                        if (i > 0)
        !          1058:                        {
        !          1059:                                /* invalid relation name */
        !          1060:                                par_error(RNGEXIST, WARN, "rdelim", 0);
        !          1061:                                YYERROR;
        !          1062:                        }
        !          1063:                        else
        !          1064:                        {
        !          1065:                                if ( i = destroy_delim(&Reldesc, $3) < 0)
        !          1066:                                {
        !          1067:                                        closer(&Reldesc);
        !          1068:                                        par_error(DELEXIST, WARN, "rdelim",0);
        !          1069:                                }
        !          1070:                        }
        !          1071:                        closer(&Reldesc);
        !          1072:                }
        !          1073: ;
        !          1074: destmnt:       DESTROY =
        !          1075:                {
        !          1076:                        Opflag = mdDESTROY;
        !          1077:                }
        !          1078: ;
        !          1079: destqm:                destmnt INTEGRITY NAME =
        !          1080:                {
        !          1081:                        Opflag = mdREMQM;
        !          1082:                        if (!Qrymod)
        !          1083:                                /* no qrymod in database */
        !          1084:                                par_error(NOQRYMOD, WARN, 0);
        !          1085:                        setp(PV_STR, "6");
        !          1086:                        setp(PV_STR, $3);
        !          1087:                }
        !          1088:        |       destmnt PERMIT NAME =
        !          1089:                {
        !          1090:                        Opflag = mdREMQM;
        !          1091:                        if (!Qrymod)
        !          1092:                                /* no qrymod in database */
        !          1093:                                par_error(NOQRYMOD, WARN, 0);
        !          1094:                        setp(PV_STR, "5");
        !          1095:                        setp(PV_STR, $3);
        !          1096:                }
        !          1097: ;
        !          1098: destlist:      I2CONST =
        !          1099:                {
        !          1100:                        i = iocv(*($1));
        !          1101:                        setp(PV_STR, i);
        !          1102:                }
        !          1103:        |       destlist COMMA I2CONST =
        !          1104:                {
        !          1105:                        i = iocv(*($3));
        !          1106:                        setp(PV_STR, i);
        !          1107:                }
        !          1108:        |       ALL
        !          1109: ;
        !          1110: help:          helstmnt hlist
        !          1111:        |       helstmnt =
        !          1112:                {
        !          1113:                        setp(PV_INT, RELIST);   /* all relns */
        !          1114:                }
        !          1115:        |       helqmstmnt hqmlist
        !          1116:        |       heldelstmnt =
        !          1117:                {
        !          1118:                        setp(PV_INT, ALLDELLIST);       /* all delims */
        !          1119:                }
        !          1120:        |       heldelstmnt dlist
        !          1121: ;
        !          1122: helstmnt:      HELP =
        !          1123:                {
        !          1124:                        Opflag = mdHELP;
        !          1125:                }
        !          1126: ;
        !          1127: heldelstmnt:   HELP DELIM =
        !          1128:                {
        !          1129:                        Opflag = mdHELP;
        !          1130:                }
        !          1131: ;
        !          1132: helqmstmnt:    HELP VIEW =
        !          1133:                {
        !          1134:                        Opflag = mdDISPLAY;
        !          1135:                        if (!Qrymod)
        !          1136:                                /* no qrymod in database */
        !          1137:                                par_error(NOQRYMOD, WARN, 0);
        !          1138:                        smove("4", hqmbuf);
        !          1139:                }
        !          1140:        |       HELP PERMIT =
        !          1141:                {
        !          1142:                        Opflag = mdDISPLAY;
        !          1143:                        if (!Qrymod)
        !          1144:                                /* no qrymod in database */
        !          1145:                                par_error(NOQRYMOD, WARN, 0);
        !          1146:                        smove("5", hqmbuf);
        !          1147:                }
        !          1148:        |       HELP INTEGRITY =
        !          1149:                {
        !          1150:                        Opflag = mdDISPLAY;
        !          1151:                        if (!Qrymod)
        !          1152:                                /* no qrymod in database */
        !          1153:                                par_error(NOQRYMOD, WARN, 0);
        !          1154:                        smove("6", hqmbuf);
        !          1155:                }
        !          1156: 
        !          1157: ;
        !          1158: hlist:         hparam
        !          1159:        |       hlist COMMA hparam
        !          1160:        |       ALL =
        !          1161:                {
        !          1162:                        setp(PV_INT, ALLRELINFO);
        !          1163:                }
        !          1164: ;
        !          1165: dlist:         dparam
        !          1166:        |       dlist COMMA dparam
        !          1167: ;
        !          1168: dparam:        NAME =
        !          1169:                {
        !          1170:                        /* relation */
        !          1171:                        setp(PV_INT, DELLIST);
        !          1172:                        setp(PV_STR, $1);
        !          1173:                }
        !          1174: ;
        !          1175: hparam:                NAME =
        !          1176:                {
        !          1177:                        /* relation */
        !          1178:                        setp(PV_INT, RELINFO);
        !          1179:                        setp(PV_STR, $1);
        !          1180:                }
        !          1181:        |       SCONST =
        !          1182:                {
        !          1183:                        /* manual page */
        !          1184:                        setp(PV_INT, MANSEC);
        !          1185:                        setp(PV_STR, $1);
        !          1186:                }
        !          1187: ;
        !          1188: hqmlist:       NAME =
        !          1189:                {
        !          1190:                        setp(PV_STR, hqmbuf);
        !          1191:                        setp(PV_STR, $1);
        !          1192:                }
        !          1193:        |       hqmlist COMMA NAME =
        !          1194:                {
        !          1195:                        setp(PV_STR, hqmbuf);
        !          1196:                        setp(PV_STR, $3);
        !          1197:                }
        !          1198: ;
        !          1199: index:         instmnt LPAREN keys RPAREN =
        !          1200:                {
        !          1201:                        if (Rsdmno > MAXKEYS)
        !          1202:                                /* too many attributes in key */
        !          1203:                                par_error(INDEXTRA, WARN, 0);
        !          1204:                }
        !          1205: ;
        !          1206: instmnt:       indexq ON NAME IS NAME =
        !          1207:                {
        !          1208:                        /* init INDEX command */
        !          1209:                        Rsdmno = 0;
        !          1210:                        setp(PV_STR, $3);
        !          1211:                        setp(PV_STR, $5);
        !          1212:                        Indexname = $5;
        !          1213:                }
        !          1214: ;
        !          1215: indexq:                INDEX =
        !          1216:                {
        !          1217:                        Opflag = mdINDEX;
        !          1218:                }
        !          1219: ;
        !          1220: modify:                modstmnt alias TO modstorage modkeys modqual
        !          1221: ;
        !          1222: modstmnt:      MODIFY =
        !          1223:                {
        !          1224:                        Opflag = mdMODIFY;
        !          1225:                        Rsdmno = 0;
        !          1226:                }
        !          1227: ;
        !          1228: modstorage:    NAME =
        !          1229:                {
        !          1230:                        setp(PV_STR, $1);
        !          1231:                }
        !          1232: modkeys:       modstkey modrptkey
        !          1233:        |       ;
        !          1234: ;
        !          1235: modstkey:      ON =
        !          1236:                {
        !          1237:                        setp(PV_STR, "name");
        !          1238:                }
        !          1239: ;
        !          1240: modrptkey:     modbasekey
        !          1241:        |       modrptkey COMMA modbasekey
        !          1242: ;
        !          1243: modbasekey:    NAME =
        !          1244:                {
        !          1245:                        setp(PV_STR, $1);
        !          1246:                }
        !          1247:        |       NAME COLON NAME =
        !          1248:                {
        !          1249:                        concat($1, ztack(":", $3), modbuf);
        !          1250:                        setp(PV_STR, modbuf);
        !          1251:                }
        !          1252: ;
        !          1253: modqual:       modcond modfill
        !          1254:        |       ;
        !          1255: ;
        !          1256: modcond:       WHERE =
        !          1257:                {
        !          1258:                        setp(PV_STR, "\0");
        !          1259:                }
        !          1260: ;
        !          1261: modfill:       modfillnum
        !          1262:        |       modfill COMMA modfillnum
        !          1263: ;
        !          1264: modfillnum:    NAME IS I2CONST =
        !          1265:                {
        !          1266:                        setp(PV_STR, $1);
        !          1267:                        i = iocv(*($3));
        !          1268:                        setp(PV_STR, i);
        !          1269:                }
        !          1270:        |       NAME IS NAME =
        !          1271:                {
        !          1272:                        setp(PV_STR, $1);
        !          1273:                        setp(PV_STR, $3);
        !          1274:                }
        !          1275: ;
        !          1276: keys:          alias =
        !          1277:                {
        !          1278:                        Rsdmno++;
        !          1279:                }
        !          1280:        |       keys COMMA alias =
        !          1281:                {
        !          1282:                        Rsdmno++;
        !          1283:                }
        !          1284: ;
        !          1285: print:         prinstmnt keys
        !          1286: ;
        !          1287: prinstmnt:     PRINT =
        !          1288:                {
        !          1289:                        Opflag = mdPRINT;
        !          1290:                }
        !          1291: ;
        !          1292: save:          savstmnt alias UNTIL date
        !          1293: ;
        !          1294: savstmnt:      SAVE =
        !          1295:                {
        !          1296:                        Opflag = mdSAVE;
        !          1297:                }
        !          1298: ;
        !          1299: date:          month day_year day_year
        !          1300: ;
        !          1301: month:         alias
        !          1302:        |       day_year
        !          1303: ;
        !          1304: day_year:      I2CONST =
        !          1305:                {
        !          1306:                        i = iocv(*($1));
        !          1307: 
        !          1308: #                      ifdef   xPTR3
        !          1309:                        tTfp(39, 4, "day_year: %s\n", i);
        !          1310: #                      endif
        !          1311: 
        !          1312:                        setp(PV_STR, i);
        !          1313:                }
        !          1314: ;
        !          1315: %%
        !          1316: # include      "scanner.h"
        !          1317: # include      "tables.y"
        !          1318: # include      "yyerror.y"

unix.superglobalmegacorp.com

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