Annotation of 43BSD/usr.bin/f77/src/f77pass1/gram.dcl, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  *
        !             6:  *     @(#)gram.dcl    5.4 (Berkeley) 1/30/86
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  * Grammar for declarations, f77 compiler, 4.2 BSD.
        !            11:  *
        !            12:  * University of Utah CS Dept modification history:
        !            13:  *
        !            14:  * $Log:       gram.dcl,v $
        !            15:  * Revision 5.7  86/01/30  15:20:27  donn
        !            16:  * Improve error message reporting.
        !            17:  * 
        !            18:  * Revision 5.6  85/12/18  20:10:26  donn
        !            19:  * Enforce more strict ordering of specification statements. per the
        !            20:  * standard.  Some duplicated code is now concentrated in the nonterminal
        !            21:  * 'inside', which is used to indicate the start of a program.
        !            22:  * 
        !            23:  * Revision 5.5  85/11/25  00:23:59  donn
        !            24:  * 4.3 beta
        !            25:  * 
        !            26:  * Revision 5.4  85/08/20  23:37:33  donn
        !            27:  * Fix from Jerry Berkman to prevent length problems with -r8.
        !            28:  * 
        !            29:  * Revision 5.3  85/08/15  20:16:29  donn
        !            30:  * SAVE statements are not executable...
        !            31:  * 
        !            32:  * Revision 5.2  85/08/10  04:24:56  donn
        !            33:  * Jerry Berkman's changes to handle the -r8/double precision flag.
        !            34:  * 
        !            35:  * Revision 5.1  85/08/10  03:47:18  donn
        !            36:  * 4.3 alpha
        !            37:  * 
        !            38:  * Revision 3.2  84/11/12  18:36:26  donn
        !            39:  * A side effect of removing the ability of labels to define the start of
        !            40:  * a program is that format statements have to do the job now...
        !            41:  * 
        !            42:  * Revision 3.1  84/10/13  00:26:54  donn
        !            43:  * Installed Jerry Berkman's version; added comment header.
        !            44:  * 
        !            45:  */
        !            46: 
        !            47: spec:    dcl
        !            48:        | common
        !            49:        | external
        !            50:        | intrinsic
        !            51:        | equivalence
        !            52:        | implicit
        !            53:        | data
        !            54:        | namelist
        !            55:        | SSAVE in_dcl
        !            56:                { NO66("SAVE statement");
        !            57:                  saveall = YES; }
        !            58:        | SSAVE in_dcl savelist
        !            59:                { NO66("SAVE statement"); }
        !            60:        | SFORMAT inside
        !            61:                {
        !            62:                fmtstmt(thislabel);
        !            63:                setfmt(thislabel);
        !            64:                }
        !            65:        | SPARAM in_param SLPAR paramlist SRPAR
        !            66:                { NO66("PARAMETER statement"); }
        !            67:        ;
        !            68: 
        !            69: dcl:     type opt_comma name in_dcl dims lengspec
        !            70:                { settype($3, $1, $6);
        !            71:                  if(ndim>0) setbound($3,ndim,dims);
        !            72:                }
        !            73:        | dcl SCOMMA name dims lengspec
        !            74:                { settype($3, $1, $5);
        !            75:                  if(ndim>0) setbound($3,ndim,dims);
        !            76:                }
        !            77:        ;
        !            78: 
        !            79: type:    typespec lengspec
        !            80:                { varleng = $2; }
        !            81:        ;
        !            82: 
        !            83: typespec:  typename
        !            84:                { varleng = ($1<0 || $1==TYLONG ? 0 : typesize[$1]);
        !            85:                  vartype = $1;
        !            86:                }
        !            87:        ;
        !            88: 
        !            89: typename:    SINTEGER  { $$ = TYLONG; }
        !            90:        | SREAL         { $$ = dblflag ? TYDREAL : TYREAL; }
        !            91:        | SCOMPLEX      { $$ = dblflag ? TYDCOMPLEX : TYCOMPLEX; }
        !            92:        | SDOUBLE       { $$ = TYDREAL; }
        !            93:        | SDCOMPLEX     { NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; }
        !            94:        | SLOGICAL      { $$ = TYLOGICAL; }
        !            95:        | SCHARACTER    { NO66("CHARACTER statement"); $$ = TYCHAR; }
        !            96:        | SUNDEFINED    { $$ = TYUNKNOWN; }
        !            97:        | SDIMENSION    { $$ = TYUNKNOWN; }
        !            98:        | SAUTOMATIC    { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; }
        !            99:        | SSTATIC       { NOEXT("STATIC statement"); $$ = - STGBSS; }
        !           100:        ;
        !           101: 
        !           102: lengspec:
        !           103:                { $$ = varleng; }
        !           104:        | SSTAR intonlyon expr intonlyoff
        !           105:                {
        !           106:                expptr p;
        !           107:                int typlen;
        !           108:                
        !           109:                p = $3;
        !           110:                NO66("length specification *n");
        !           111:                if( ! ISICON(p) )
        !           112:                        {
        !           113:                        $$ = 0;
        !           114:                        dclerr("length expression is not type integer", PNULL);
        !           115:                        }
        !           116:                else if ( p->constblock.const.ci < 0 )
        !           117:                        {
        !           118:                        $$ = 0;
        !           119:                        dclerr("illegal negative length", PNULL);
        !           120:                        }
        !           121:                else if( dblflag )
        !           122:                        {
        !           123:                        typlen = p->constblock.const.ci;
        !           124:                        if( vartype == TYDREAL && typlen == 4 ) $$ = 8;
        !           125:                        else if( vartype == TYDCOMPLEX && typlen == 8 ) $$ = 16;
        !           126:                        else $$ = typlen;
        !           127:                        }
        !           128:                else
        !           129:                        $$ = p->constblock.const.ci;
        !           130:                }
        !           131:        | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
        !           132:                { NO66("length specification *(*)"); $$ = -1; }
        !           133:        ;
        !           134: 
        !           135: common:          SCOMMON in_dcl var
        !           136:                { incomm( $$ = comblock(0, CNULL) , $3 ); }
        !           137:        | SCOMMON in_dcl comblock var
        !           138:                { $$ = $3;  incomm($3, $4); }
        !           139:        | common opt_comma comblock opt_comma var
        !           140:                { $$ = $3;  incomm($3, $5); }
        !           141:        | common SCOMMA var
        !           142:                { incomm($1, $3); }
        !           143:        ;
        !           144: 
        !           145: comblock:  SCONCAT
        !           146:                { $$ = comblock(0, CNULL); }
        !           147:        | SSLASH SNAME SSLASH
        !           148:                { $$ = comblock(toklen, token); }
        !           149:        ;
        !           150: 
        !           151: external: SEXTERNAL in_dcl name
        !           152:                { setext($3); }
        !           153:        | external SCOMMA name
        !           154:                { setext($3); }
        !           155:        ;
        !           156: 
        !           157: intrinsic:  SINTRINSIC in_dcl name
        !           158:                { NO66("INTRINSIC statement"); setintr($3); }
        !           159:        | intrinsic SCOMMA name
        !           160:                { setintr($3); }
        !           161:        ;
        !           162: 
        !           163: equivalence:  SEQUIV in_dcl equivset
        !           164:        | equivalence SCOMMA equivset
        !           165:        ;
        !           166: 
        !           167: equivset:  SLPAR equivlist SRPAR
        !           168:                {
        !           169:                struct Equivblock *p;
        !           170:                if(nequiv >= maxequiv)
        !           171:                        many("equivalences", 'q');
        !           172:                if( !equivlisterr ) {
        !           173:                   p  =  & eqvclass[nequiv++];
        !           174:                   p->eqvinit = NO;
        !           175:                   p->eqvbottom = 0;
        !           176:                   p->eqvtop = 0;
        !           177:                   p->equivs = $2;
        !           178:                   p->init = NO;
        !           179:                   p->initoffset = 0;
        !           180:                   }
        !           181:                }
        !           182:        ;
        !           183: 
        !           184: equivlist:  lhs
        !           185:                { $$=ALLOC(Eqvchain);
        !           186:                  equivlisterr = 0;
        !           187:                  if( $1->tag == TCONST ) {
        !           188:                        equivlisterr = 1;
        !           189:                        dclerr( "- constant in equivalence", NULL );
        !           190:                  }
        !           191:                  $$->eqvitem.eqvlhs = (struct Primblock *)$1;
        !           192:                }
        !           193:        | equivlist SCOMMA lhs
        !           194:                { $$=ALLOC(Eqvchain);
        !           195:                  if( $3->tag == TCONST ) {
        !           196:                        equivlisterr = 1;
        !           197:                        dclerr( "constant in equivalence", NULL );
        !           198:                  }
        !           199:                  $$->eqvitem.eqvlhs = (struct Primblock *) $3;
        !           200:                  $$->eqvnextp = $1;
        !           201:                }
        !           202:        ;
        !           203: 
        !           204: 
        !           205: savelist: saveitem
        !           206:        | savelist SCOMMA saveitem
        !           207:        ;
        !           208: 
        !           209: saveitem: name
        !           210:                { int k;
        !           211:                  $1->vsave = YES;
        !           212:                  k = $1->vstg;
        !           213:                if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) 
        !           214:                                || ($1->vclass == CLPARAM) )
        !           215:                        dclerr("can only save static variables", $1);
        !           216:                }
        !           217:        | comblock
        !           218:                { $1->extsave = 1; }
        !           219:        ;
        !           220: 
        !           221: paramlist:  paramitem
        !           222:        | paramlist SCOMMA paramitem
        !           223:        ;
        !           224: 
        !           225: paramitem:  name SEQUALS expr
        !           226:                { paramset( $1, $3 ); }
        !           227:        ;
        !           228: 
        !           229: in_param:      inside
        !           230:                { if(parstate > INDCL)
        !           231:                        dclerr("parameter statement out of order", PNULL);
        !           232:                }
        !           233:        ;
        !           234: 
        !           235: var:     name dims
        !           236:                { if(ndim>0) setbound($1, ndim, dims); }
        !           237:        ;
        !           238: 
        !           239: 
        !           240: dims:
        !           241:                { ndim = 0; }
        !           242:        | SLPAR dimlist SRPAR
        !           243:        ;
        !           244: 
        !           245: dimlist:   { ndim = 0; }   dim
        !           246:        | dimlist SCOMMA dim
        !           247:        ;
        !           248: 
        !           249: dim:     ubound
        !           250:                { if(ndim == maxdim)
        !           251:                        err("too many dimensions");
        !           252:                  else if(ndim < maxdim)
        !           253:                        { dims[ndim].lb = 0;
        !           254:                          dims[ndim].ub = $1;
        !           255:                        }
        !           256:                  ++ndim;
        !           257:                }
        !           258:        | expr SCOLON ubound
        !           259:                { if(ndim == maxdim)
        !           260:                        err("too many dimensions");
        !           261:                  else if(ndim < maxdim)
        !           262:                        { dims[ndim].lb = $1;
        !           263:                          dims[ndim].ub = $3;
        !           264:                        }
        !           265:                  ++ndim;
        !           266:                }
        !           267:        ;
        !           268: 
        !           269: ubound:          SSTAR
        !           270:                { $$ = 0; }
        !           271:        | expr
        !           272:        ;
        !           273: 
        !           274: labellist: label
        !           275:                { nstars = 1; labarray[0] = $1; }
        !           276:        | labellist SCOMMA label
        !           277:                { if(nstars < MAXLABLIST)  labarray[nstars++] = $3; }
        !           278:        ;
        !           279: 
        !           280: label:   SICON
        !           281:                { $$ = execlab( convci(toklen, token) ); }
        !           282:        ;
        !           283: 
        !           284: implicit:  SIMPLICIT in_implicit implist
        !           285:                { NO66("IMPLICIT statement"); }
        !           286:        | implicit SCOMMA implist
        !           287:        ;
        !           288: 
        !           289: implist:  imptype SLPAR letgroups SRPAR
        !           290:        ;
        !           291: 
        !           292: imptype:   { needkwd = 1; } type
        !           293:                { vartype = $2; }
        !           294:        ;
        !           295: 
        !           296: in_implicit:   inside
        !           297:                { if(parstate >= INDCL)
        !           298:                        dclerr("implicit statement out of order", PNULL);
        !           299:                }
        !           300:        ;
        !           301: 
        !           302: letgroups: letgroup
        !           303:        | letgroups SCOMMA letgroup
        !           304:        ;
        !           305: 
        !           306: letgroup:  letter
        !           307:                { setimpl(vartype, varleng, $1, $1); }
        !           308:        | letter SMINUS letter
        !           309:                { setimpl(vartype, varleng, $1, $3); }
        !           310:        ;
        !           311: 
        !           312: letter:  SNAME
        !           313:                { if(toklen!=1 || token[0]<'a' || token[0]>'z')
        !           314:                        {
        !           315:                        dclerr("implicit item must be single letter", PNULL);
        !           316:                        $$ = 0;
        !           317:                        }
        !           318:                  else $$ = token[0];
        !           319:                }
        !           320:        ;
        !           321: 
        !           322: namelist:      SNAMELIST
        !           323:        | namelist namelistentry
        !           324:        ;
        !           325: 
        !           326: namelistentry:  SSLASH name SSLASH namelistlist
        !           327:                {
        !           328:                if($2->vclass == CLUNKNOWN)
        !           329:                        {
        !           330:                        $2->vclass = CLNAMELIST;
        !           331:                        $2->vtype = TYINT;
        !           332:                        $2->vstg = STGINIT;
        !           333:                        $2->varxptr.namelist = $4;
        !           334:                        $2->vardesc.varno = ++lastvarno;
        !           335:                        }
        !           336:                else dclerr("cannot be a namelist name", $2);
        !           337:                }
        !           338:        ;
        !           339: 
        !           340: namelistlist:  name
        !           341:                { $$ = mkchain($1, CHNULL); }
        !           342:        | namelistlist SCOMMA name
        !           343:                { $$ = hookup($1, mkchain($3, CHNULL)); }
        !           344:        ;
        !           345: 
        !           346: inside:
        !           347:                { if(parstate < INSIDE)
        !           348:                        {
        !           349:                        newproc();
        !           350:                        startproc(PNULL, CLMAIN);
        !           351:                        parstate = INSIDE;
        !           352:                        }
        !           353:                }
        !           354:        ;
        !           355: 
        !           356: in_dcl:        inside
        !           357:                { if(parstate < INDCL)
        !           358:                        parstate = INDCL;
        !           359:                  if(parstate > INDCL)
        !           360:                        dclerr("declaration among executables", PNULL);
        !           361:                }
        !           362:        ;
        !           363: 
        !           364: data:  data1
        !           365:        {
        !           366:          if (overlapflag == YES)
        !           367:            warn("overlapping initializations");
        !           368:        }
        !           369: 
        !           370: data1: SDATA in_data datapair
        !           371:     |  data1 opt_comma datapair
        !           372:     ;
        !           373: 
        !           374: in_data:       inside
        !           375:                { if(parstate < INDATA)
        !           376:                        {
        !           377:                        enddcl();
        !           378:                        parstate = INDATA;
        !           379:                        }
        !           380:                  overlapflag = NO;
        !           381:                }
        !           382:        ;
        !           383: 
        !           384: datapair:      datalvals SSLASH datarvals SSLASH
        !           385:                        { savedata($1, $3); }
        !           386:        ;
        !           387: 
        !           388: datalvals:     datalval
        !           389:                { $$ = preplval(NULL, $1); }
        !           390:         |      datalvals SCOMMA datalval
        !           391:                { $$ = preplval($1, $3); }
        !           392:         ;
        !           393: 
        !           394: datarvals:     datarval
        !           395:         |      datarvals SCOMMA datarval
        !           396:                        {
        !           397:                          $3->next = $1;
        !           398:                          $$ = $3;
        !           399:                        }
        !           400:         ;
        !           401: 
        !           402: datalval:      dataname
        !           403:                        { $$ = mkdlval($1, NULL, NULL); }
        !           404:        |       dataname datasubs
        !           405:                        { $$ = mkdlval($1, $2, NULL); }
        !           406:        |       dataname datarange
        !           407:                        { $$ = mkdlval($1, NULL, $2); }
        !           408:        |       dataname datasubs datarange
        !           409:                        { $$ = mkdlval($1, $2, $3); }
        !           410:        |       dataimplieddo
        !           411:        ;
        !           412: 
        !           413: dataname:      SNAME { $$ = mkdname(toklen, token); }
        !           414:        ;
        !           415: 
        !           416: datasubs:      SLPAR iconexprlist SRPAR
        !           417:                        { $$ = revvlist($2); }
        !           418:        ;
        !           419: 
        !           420: datarange:     SLPAR opticonexpr SCOLON opticonexpr SRPAR
        !           421:                        { $$ = mkdrange($2, $4); }
        !           422:         ;
        !           423: 
        !           424: iconexprlist:  iconexpr
        !           425:                        {
        !           426:                          $$ = prepvexpr(NULL, $1);
        !           427:                        }
        !           428:            |   iconexprlist SCOMMA iconexpr
        !           429:                        {
        !           430:                          $$ = prepvexpr($1, $3);
        !           431:                        }
        !           432:            ;
        !           433: 
        !           434: opticonexpr:                   { $$ = NULL; }
        !           435:           |    iconexpr        { $$ = $1; }
        !           436:           ;
        !           437: 
        !           438: dataimplieddo: SLPAR dlist SCOMMA dataname SEQUALS iconexprlist SRPAR
        !           439:                { $$ = mkdatado($2, $4, $6); }
        !           440:             ;
        !           441: 
        !           442: dlist: dataelt
        !           443:        { $$ = preplval(NULL, $1); }
        !           444:      | dlist SCOMMA dataelt
        !           445:        { $$ = preplval($1, $3); }
        !           446:      ;
        !           447: 
        !           448: dataelt:       dataname datasubs
        !           449:                { $$ = mkdlval($1, $2, NULL); }
        !           450:        |       dataname datarange
        !           451:                { $$ = mkdlval($1, NULL, $2); }
        !           452:        |       dataname datasubs datarange
        !           453:                { $$ = mkdlval($1, $2, $3); }
        !           454:        |       dataimplieddo
        !           455:        ;
        !           456: 
        !           457: datarval:      datavalue
        !           458:                        {
        !           459:                          static dvalue one = { DVALUE, NORMAL, 1 };
        !           460: 
        !           461:                          $$ = mkdrval(&one, $1);
        !           462:                        }
        !           463:        |       dataname SSTAR datavalue
        !           464:                        {
        !           465:                          $$ = mkdrval($1, $3);
        !           466:                          frvexpr($1);
        !           467:                        }
        !           468:        |       unsignedint SSTAR datavalue
        !           469:                        {
        !           470:                          $$ = mkdrval($1, $3);
        !           471:                          frvexpr($1);
        !           472:                        }
        !           473:        ;
        !           474: 
        !           475: datavalue:     dataname
        !           476:                        {
        !           477:                          $$ = evparam($1);
        !           478:                          free((char *) $1);
        !           479:                        }
        !           480:         |      int_const
        !           481:                        {
        !           482:                          $$ = ivaltoicon($1);
        !           483:                          frvexpr($1);
        !           484:                        }
        !           485: 
        !           486:         |      real_const
        !           487:         |      complex_const
        !           488:         |      STRUE           { $$ = mklogcon(1); }
        !           489:         |      SFALSE          { $$ = mklogcon(0); }
        !           490:         |      SHOLLERITH      { $$ = mkstrcon(toklen, token); }
        !           491:         |      SSTRING         { $$ = mkstrcon(toklen, token); }
        !           492:         |      bit_const
        !           493:         ;
        !           494: 
        !           495: int_const:     unsignedint
        !           496:         |      SPLUS unsignedint
        !           497:                        { $$ = $2; }
        !           498:         |      SMINUS unsignedint
        !           499:                        {
        !           500:                          $$ = negival($2);
        !           501:                          frvexpr($2);
        !           502:                        }
        !           503:                                
        !           504:         ;
        !           505: 
        !           506: unsignedint:   SICON { $$ = evicon(toklen, token); }
        !           507:           ;
        !           508: 
        !           509: real_const:    unsignedreal
        !           510:          |     SPLUS unsignedreal
        !           511:                        { $$ = $2; }
        !           512:          |     SMINUS unsignedreal
        !           513:                        {
        !           514:                          consnegop($2);
        !           515:                          $$ = $2;
        !           516:                        }
        !           517:          ;
        !           518: 
        !           519: unsignedreal:  SRCON { $$ = mkrealcon(TYREAL, convcd(toklen, token)); }
        !           520:            |   SDCON { $$ = mkrealcon(TYDREAL, convcd(toklen, token)); }
        !           521:            ;
        !           522: 
        !           523: bit_const:     SHEXCON { $$ = mkbitcon(4, toklen, token); }
        !           524:         |      SOCTCON { $$ = mkbitcon(3, toklen, token); }
        !           525:         |      SBITCON { $$ = mkbitcon(1, toklen, token); }
        !           526:         ;
        !           527: 
        !           528: iconexpr:      iconterm
        !           529:        |       SPLUS iconterm
        !           530:                        { $$ = $2; }
        !           531:        |       SMINUS iconterm
        !           532:                        { $$ = mkdexpr(OPNEG, NULL, $2); }
        !           533:        |       iconexpr SPLUS iconterm
        !           534:                        { $$ = mkdexpr(OPPLUS, $1, $3); }
        !           535:        |       iconexpr SMINUS iconterm
        !           536:                        { $$ = mkdexpr(OPMINUS, $1, $3); }
        !           537:        ;
        !           538: 
        !           539: iconterm:      iconfactor
        !           540:        |       iconterm SSTAR iconfactor
        !           541:                        { $$ = mkdexpr(OPSTAR, $1, $3); }
        !           542:        |       iconterm SSLASH iconfactor
        !           543:                        { $$ = mkdexpr(OPSLASH, $1, $3); }
        !           544:        ;
        !           545: 
        !           546: iconfactor:    iconprimary
        !           547:          |     iconprimary SPOWER iconfactor
        !           548:                        { $$ = mkdexpr(OPPOWER, $1, $3); }
        !           549:          ;
        !           550: 
        !           551: iconprimary:   SICON
        !           552:                        { $$ = evicon(toklen, token); }
        !           553:           |    dataname
        !           554:           |    SLPAR iconexpr SRPAR
        !           555:                        { $$ = $2; }
        !           556:           ;

unix.superglobalmegacorp.com

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