Annotation of researchv10no/cmd/f2c/gram.dcl, revision 1.1

1.1     ! root        1: spec:    dcl
        !             2:        | common
        !             3:        | external
        !             4:        | intrinsic
        !             5:        | equivalence
        !             6:        | data
        !             7:        | implicit
        !             8:        | namelist
        !             9:        | SSAVE
        !            10:                { NO66("SAVE statement");
        !            11:                  saveall = YES; }
        !            12:        | SSAVE savelist
        !            13:                { NO66("SAVE statement"); }
        !            14:        | SFORMAT
        !            15:                { fmtstmt(thislabel); setfmt(thislabel); }
        !            16:        | SPARAM in_dcl SLPAR paramlist SRPAR
        !            17:                { NO66("PARAMETER statement"); }
        !            18:        ;
        !            19: 
        !            20: dcl:     type opt_comma name in_dcl new_dcl dims lengspec
        !            21:                { settype($3, $1, $7);
        !            22:                  if(ndim>0) setbound($3,ndim,dims);
        !            23:                }
        !            24:        | dcl SCOMMA name dims lengspec
        !            25:                { settype($3, $1, $5);
        !            26:                  if(ndim>0) setbound($3,ndim,dims);
        !            27:                }
        !            28:        | dcl SSLASHD datainit vallist SSLASHD
        !            29:                { if (new_dcl == 2) {
        !            30:                        err("attempt to give DATA in type-declaration");
        !            31:                        new_dcl = 1;
        !            32:                        }
        !            33:                }
        !            34:        ;
        !            35: 
        !            36: new_dcl:       { new_dcl = 2; }
        !            37: 
        !            38: type:    typespec lengspec
        !            39:                { varleng = $2; }
        !            40:        ;
        !            41: 
        !            42: typespec:  typename
        !            43:                { varleng = ($1<0 || ONEOF($1,M(TYLOGICAL)|M(TYLONG))
        !            44:                                ? 0 : typesize[$1]);
        !            45:                  vartype = $1; }
        !            46:        ;
        !            47: 
        !            48: typename:    SINTEGER  { $$ = TYLONG; }
        !            49:        | SREAL         { $$ = tyreal; }
        !            50:        | SCOMPLEX      { ++complex_seen; $$ = tycomplex; }
        !            51:        | SDOUBLE       { $$ = TYDREAL; }
        !            52:        | SDCOMPLEX     { ++dcomplex_seen; NOEXT("DOUBLE COMPLEX statement"); $$ = TYDCOMPLEX; }
        !            53:        | SLOGICAL      { $$ = TYLOGICAL; }
        !            54:        | SCHARACTER    { NO66("CHARACTER statement"); $$ = TYCHAR; }
        !            55:        | SUNDEFINED    { $$ = TYUNKNOWN; }
        !            56:        | SDIMENSION    { $$ = TYUNKNOWN; }
        !            57:        | SAUTOMATIC    { NOEXT("AUTOMATIC statement"); $$ = - STGAUTO; }
        !            58:        | SSTATIC       { NOEXT("STATIC statement"); $$ = - STGBSS; }
        !            59:        ;
        !            60: 
        !            61: lengspec:
        !            62:                { $$ = varleng; }
        !            63:        | SSTAR intonlyon expr intonlyoff
        !            64:                {
        !            65:                expptr p;
        !            66:                p = $3;
        !            67:                NO66("length specification *n");
        !            68:                if( ! ISICON(p) || p->constblock.Const.ci <= 0 )
        !            69:                        {
        !            70:                        $$ = 0;
        !            71:                        dclerr("length must be a positive integer constant",
        !            72:                                NPNULL);
        !            73:                        }
        !            74:                else {
        !            75:                        if (vartype == TYCHAR)
        !            76:                                $$ = p->constblock.Const.ci;
        !            77:                        else switch((int)p->constblock.Const.ci) {
        !            78:                                case 1: $$ = 1; break;
        !            79:                                case 2: $$ = typesize[TYSHORT]; break;
        !            80:                                case 4: $$ = typesize[TYLONG];  break;
        !            81:                                case 8: $$ = typesize[TYDREAL]; break;
        !            82:                                case 16: $$ = typesize[TYDCOMPLEX]; break;
        !            83:                                default:
        !            84:                                        dclerr("invalid length",NPNULL);
        !            85:                                        $$ = varleng;
        !            86:                                }
        !            87:                        }
        !            88:                }
        !            89:        | SSTAR intonlyon SLPAR SSTAR SRPAR intonlyoff
        !            90:                { NO66("length specification *(*)"); $$ = -1; }
        !            91:        ;
        !            92: 
        !            93: common:          SCOMMON in_dcl var
        !            94:                { incomm( $$ = comblock("") , $3 ); }
        !            95:        | SCOMMON in_dcl comblock var
        !            96:                { $$ = $3;  incomm($3, $4); }
        !            97:        | common opt_comma comblock opt_comma var
        !            98:                { $$ = $3;  incomm($3, $5); }
        !            99:        | common SCOMMA var
        !           100:                { incomm($1, $3); }
        !           101:        ;
        !           102: 
        !           103: comblock:  SCONCAT
        !           104:                { $$ = comblock(""); }
        !           105:        | SSLASH SNAME SSLASH
        !           106:                { $$ = comblock(token); }
        !           107:        ;
        !           108: 
        !           109: external: SEXTERNAL in_dcl name
        !           110:                { setext($3); }
        !           111:        | external SCOMMA name
        !           112:                { setext($3); }
        !           113:        ;
        !           114: 
        !           115: intrinsic:  SINTRINSIC in_dcl name
        !           116:                { NO66("INTRINSIC statement"); setintr($3); }
        !           117:        | intrinsic SCOMMA name
        !           118:                { setintr($3); }
        !           119:        ;
        !           120: 
        !           121: equivalence:  SEQUIV in_dcl equivset
        !           122:        | equivalence SCOMMA equivset
        !           123:        ;
        !           124: 
        !           125: equivset:  SLPAR equivlist SRPAR
        !           126:                {
        !           127:                struct Equivblock *p;
        !           128:                if(nequiv >= maxequiv)
        !           129:                        many("equivalences", 'q', maxequiv);
        !           130:                p  =  & eqvclass[nequiv++];
        !           131:                p->eqvinit = NO;
        !           132:                p->eqvbottom = 0;
        !           133:                p->eqvtop = 0;
        !           134:                p->equivs = $2;
        !           135:                }
        !           136:        ;
        !           137: 
        !           138: equivlist:  lhs
        !           139:                { $$=ALLOC(Eqvchain);
        !           140:                  $$->eqvitem.eqvlhs = (struct Primblock *)$1;
        !           141:                }
        !           142:        | equivlist SCOMMA lhs
        !           143:                { $$=ALLOC(Eqvchain);
        !           144:                  $$->eqvitem.eqvlhs = (struct Primblock *) $3;
        !           145:                  $$->eqvnextp = $1;
        !           146:                }
        !           147:        ;
        !           148: 
        !           149: data:    SDATA in_data datalist
        !           150:        | data opt_comma datalist
        !           151:        ;
        !           152: 
        !           153: in_data:
        !           154:                { if(parstate == OUTSIDE)
        !           155:                        {
        !           156:                        newproc();
        !           157:                        startproc(ESNULL, CLMAIN);
        !           158:                        }
        !           159:                  if(parstate < INDATA)
        !           160:                        {
        !           161:                        enddcl();
        !           162:                        parstate = INDATA;
        !           163:                        datagripe = 1;
        !           164:                        }
        !           165:                }
        !           166:        ;
        !           167: 
        !           168: datalist:  datainit datavarlist SSLASH datapop vallist SSLASH
        !           169:                { ftnint junk;
        !           170:                  if(nextdata(&junk) != NULL)
        !           171:                        err("too few initializers");
        !           172:                  frdata($2);
        !           173:                  frrpl();
        !           174:                }
        !           175:        ;
        !           176: 
        !           177: datainit: /* nothing */ { frchain(&datastack); curdtp = 0; }
        !           178: 
        !           179: datapop: /* nothing */ { pop_datastack(); }
        !           180: 
        !           181: vallist:  { toomanyinit = NO; }  val
        !           182:        | vallist SCOMMA val
        !           183:        ;
        !           184: 
        !           185: val:     value
        !           186:                { dataval(ENULL, $1); }
        !           187:        | simple SSTAR value
        !           188:                { dataval($1, $3); }
        !           189:        ;
        !           190: 
        !           191: value:   simple
        !           192:        | addop simple
        !           193:                { if( $1==OPMINUS && ISCONST($2) )
        !           194:                        consnegop((Constp)$2);
        !           195:                  $$ = $2;
        !           196:                }
        !           197:        | complex_const
        !           198:        ;
        !           199: 
        !           200: savelist: saveitem
        !           201:        | savelist SCOMMA saveitem
        !           202:        ;
        !           203: 
        !           204: saveitem: name
        !           205:                { int k;
        !           206:                  $1->vsave = YES;
        !           207:                  k = $1->vstg;
        !           208:                if( ! ONEOF(k, M(STGUNKNOWN)|M(STGBSS)|M(STGINIT)) )
        !           209:                        dclerr("can only save static variables", $1);
        !           210:                }
        !           211:        | comblock
        !           212:        ;
        !           213: 
        !           214: paramlist:  paramitem
        !           215:        | paramlist SCOMMA paramitem
        !           216:        ;
        !           217: 
        !           218: paramitem:  name SEQUALS expr
        !           219:                { if($1->vclass == CLUNKNOWN)
        !           220:                        make_param((struct Paramblock *)$1, $3);
        !           221:                  else dclerr("cannot make into parameter", $1);
        !           222:                }
        !           223:        ;
        !           224: 
        !           225: var:     name dims
        !           226:                { if(ndim>0) setbound($1, ndim, dims); }
        !           227:        ;
        !           228: 
        !           229: datavar:         lhs
        !           230:                { Namep np;
        !           231:                  np = ( (struct Primblock *) $1) -> namep;
        !           232:                  vardcl(np);
        !           233:                  if(np->vstg == STGCOMMON)
        !           234:                        extsymtab[np->vardesc.varno].extinit = YES;
        !           235:                  else if(np->vstg==STGEQUIV)
        !           236:                        eqvclass[np->vardesc.varno].eqvinit = YES;
        !           237:                  else if(np->vstg!=STGINIT && np->vstg!=STGBSS)
        !           238:                        dclerr("inconsistent storage classes", np);
        !           239:                  $$ = mkchain((char *)$1, CHNULL);
        !           240:                }
        !           241:        | SLPAR datavarlist SCOMMA dospec SRPAR
        !           242:                { chainp p; struct Impldoblock *q;
        !           243:                pop_datastack();
        !           244:                q = ALLOC(Impldoblock);
        !           245:                q->tag = TIMPLDO;
        !           246:                (q->varnp = (Namep) ($4->datap))->vimpldovar = 1;
        !           247:                p = $4->nextp;
        !           248:                if(p)  { q->implb = (expptr)(p->datap); p = p->nextp; }
        !           249:                if(p)  { q->impub = (expptr)(p->datap); p = p->nextp; }
        !           250:                if(p)  { q->impstep = (expptr)(p->datap); }
        !           251:                frchain( & ($4) );
        !           252:                $$ = mkchain((char *)q, CHNULL);
        !           253:                q->datalist = hookup($2, $$);
        !           254:                }
        !           255:        ;
        !           256: 
        !           257: datavarlist: datavar
        !           258:                { if (!datastack)
        !           259:                        curdtp = 0;
        !           260:                  datastack = mkchain((char *)curdtp, datastack);
        !           261:                  curdtp = $1; curdtelt = 0;
        !           262:                  }
        !           263:        | datavarlist SCOMMA datavar
        !           264:                { $$ = hookup($1, $3); }
        !           265:        ;
        !           266: 
        !           267: dims:
        !           268:                { ndim = 0; }
        !           269:        | SLPAR dimlist SRPAR
        !           270:        ;
        !           271: 
        !           272: dimlist:   { ndim = 0; }   dim
        !           273:        | dimlist SCOMMA dim
        !           274:        ;
        !           275: 
        !           276: dim:     ubound
        !           277:                {
        !           278:                  if(ndim == maxdim)
        !           279:                        err("too many dimensions");
        !           280:                  else if(ndim < maxdim)
        !           281:                        { dims[ndim].lb = 0;
        !           282:                          dims[ndim].ub = $1;
        !           283:                        }
        !           284:                  ++ndim;
        !           285:                }
        !           286:        | expr SCOLON ubound
        !           287:                {
        !           288:                  if(ndim == maxdim)
        !           289:                        err("too many dimensions");
        !           290:                  else if(ndim < maxdim)
        !           291:                        { dims[ndim].lb = $1;
        !           292:                          dims[ndim].ub = $3;
        !           293:                        }
        !           294:                  ++ndim;
        !           295:                }
        !           296:        ;
        !           297: 
        !           298: ubound:          SSTAR
        !           299:                { $$ = 0; }
        !           300:        | expr
        !           301:        ;
        !           302: 
        !           303: labellist: label
        !           304:                { nstars = 1; labarray[0] = $1; }
        !           305:        | labellist SCOMMA label
        !           306:                { if(nstars < maxlablist)  labarray[nstars++] = $3; }
        !           307:        ;
        !           308: 
        !           309: label:   SICON
        !           310:                { $$ = execlab( convci(toklen, token) ); }
        !           311:        ;
        !           312: 
        !           313: implicit:  SIMPLICIT in_dcl implist
        !           314:                { NO66("IMPLICIT statement"); }
        !           315:        | implicit SCOMMA implist
        !           316:        ;
        !           317: 
        !           318: implist:  imptype SLPAR letgroups SRPAR
        !           319:        | imptype
        !           320:                { if (vartype != TYUNKNOWN)
        !           321:                        dclerr("-- expected letter range",NPNULL);
        !           322:                  setimpl(vartype, varleng, 'a', 'z'); }
        !           323:        ;
        !           324: 
        !           325: imptype:   { needkwd = 1; } type
        !           326:                /* { vartype = $2; } */
        !           327:        ;
        !           328: 
        !           329: letgroups: letgroup
        !           330:        | letgroups SCOMMA letgroup
        !           331:        ;
        !           332: 
        !           333: letgroup:  letter
        !           334:                { setimpl(vartype, varleng, $1, $1); }
        !           335:        | letter SMINUS letter
        !           336:                { setimpl(vartype, varleng, $1, $3); }
        !           337:        ;
        !           338: 
        !           339: letter:  SNAME
        !           340:                { if(toklen!=1 || token[0]<'a' || token[0]>'z')
        !           341:                        {
        !           342:                        dclerr("implicit item must be single letter", NPNULL);
        !           343:                        $$ = 0;
        !           344:                        }
        !           345:                  else $$ = token[0];
        !           346:                }
        !           347:        ;
        !           348: 
        !           349: namelist:      SNAMELIST
        !           350:        | namelist namelistentry
        !           351:        ;
        !           352: 
        !           353: namelistentry:  SSLASH name SSLASH namelistlist
        !           354:                {
        !           355:                if($2->vclass == CLUNKNOWN)
        !           356:                        {
        !           357:                        $2->vclass = CLNAMELIST;
        !           358:                        $2->vtype = TYINT;
        !           359:                        $2->vstg = STGBSS;
        !           360:                        $2->varxptr.namelist = $4;
        !           361:                        $2->vardesc.varno = ++lastvarno;
        !           362:                        }
        !           363:                else dclerr("cannot be a namelist name", $2);
        !           364:                }
        !           365:        ;
        !           366: 
        !           367: namelistlist:  name
        !           368:                { $$ = mkchain((char *)$1, CHNULL); }
        !           369:        | namelistlist SCOMMA name
        !           370:                { $$ = hookup($1, mkchain((char *)$3, CHNULL)); }
        !           371:        ;
        !           372: 
        !           373: in_dcl:
        !           374:                { switch(parstate)
        !           375:                        {
        !           376:                        case OUTSIDE:   newproc();
        !           377:                                        startproc(ESNULL, CLMAIN);
        !           378:                        case INSIDE:    parstate = INDCL;
        !           379:                        case INDCL:     break;
        !           380: 
        !           381:                        case INDATA:
        !           382:                                if (datagripe) {
        !           383:                                        errstr(
        !           384:                                "Statement order error: declaration after DATA",
        !           385:                                                CNULL);
        !           386:                                        datagripe = 0;
        !           387:                                        }
        !           388:                                break;
        !           389: 
        !           390:                        default:
        !           391:                                dclerr("declaration among executables", NPNULL);
        !           392:                        }
        !           393:                }
        !           394:        ;

unix.superglobalmegacorp.com

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