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

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

unix.superglobalmegacorp.com

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