Annotation of 3BSD/cmd/f77/gram.dcl, revision 1.1

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

unix.superglobalmegacorp.com

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