Annotation of 43BSD/usr.bin/f77/src/f77pass1/gram.head, revision 1.1.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.head   5.1 (Berkeley) 6/7/85
                      7:  */
                      8: 
                      9: /*
                     10:  * gram.head
                     11:  *
                     12:  * First part of the f77 grammar, f77 compiler pass 1.
                     13:  *
                     14:  * University of Utah CS Dept modification history:
                     15:  *
                     16:  * $Log:       gram.head,v $
                     17:  * Revision 3.2  84/11/06  17:40:52  donn
                     18:  * Fixed bug with redundant labels causing errors when they appear on (e.g.)
                     19:  * PROGRAM statements.
                     20:  * 
                     21:  * Revision 3.1  84/10/13  00:22:16  donn
                     22:  * Merged Jerry Berkman's version into mine.
                     23:  * 
                     24:  * Revision 2.2  84/08/04  21:13:02  donn
                     25:  * Moved some code out of gram.head into gram.exec in accordance with
                     26:  * Jerry Berkman's fixes to make ASSIGNs work right.
                     27:  * 
                     28:  * Revision 2.1  84/07/19  12:03:20  donn
                     29:  * Changed comment headers for UofU.
                     30:  * 
                     31:  * Revision 1.2  84/03/23  22:43:06  donn
                     32:  * The subroutine argument temporary fixes from Bob Corbett didn't take into
                     33:  * account the fact that the code generator collects all the assignments to
                     34:  * temporaries at the start of a statement -- hence the temporaries need to
                     35:  * be initialized once per statement instead of once per call.
                     36:  * 
                     37:  */
                     38: 
                     39: %{
                     40: #      include "defs.h"
                     41: #      include "data.h"
                     42: 
                     43: #ifdef SDB
                     44: #      include <a.out.h>
                     45: 
                     46: #      ifndef N_SO
                     47: #              include <stab.h>
                     48: #      endif
                     49: #endif
                     50: 
                     51: static int equivlisterr;
                     52: static int do_name_err;
                     53: static int nstars;
                     54: static int ndim;
                     55: static int vartype;
                     56: static ftnint varleng;
                     57: static struct { expptr lb, ub; } dims[MAXDIM+1];
                     58: static struct Labelblock *labarray[MAXLABLIST];
                     59: static int lastwasbranch = NO;
                     60: static int thiswasbranch = NO;
                     61: extern ftnint yystno;
                     62: extern flag intonly;
                     63: 
                     64: ftnint convci();
                     65: double convcd();
                     66: expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon();
                     67: expptr mkcxcon();
                     68: struct Listblock *mklist();
                     69: struct Listblock *mklist();
                     70: struct Impldoblock *mkiodo();
                     71: struct Extsym *comblock();
                     72: 
                     73: %}
                     74: 
                     75: /* Specify precedences and associativities. */
                     76: 
                     77: %union {
                     78:        int ival;
                     79:        char *charpval;
                     80:        chainp chval;
                     81:        tagptr tagval;
                     82:        expptr expval;
                     83:        struct Labelblock *labval;
                     84:        struct Nameblock *namval;
                     85:        struct Eqvchain *eqvval;
                     86:        struct Extsym *extval;
                     87:        union  Vexpr *vexpval;
                     88:        struct ValList *drvals;
                     89:        struct Vlist *dvals;
                     90:        union  Delt *deltp;
                     91:        struct Rpair *rpairp;
                     92:        struct Elist *elistp;
                     93:        }
                     94: 
                     95: %left SCOMMA
                     96: %nonassoc SCOLON
                     97: %right SEQUALS
                     98: %left SEQV SNEQV
                     99: %left SOR
                    100: %left SAND
                    101: %left SNOT
                    102: %nonassoc SLT SGT SLE SGE SEQ SNE
                    103: %left SCONCAT
                    104: %left SPLUS SMINUS
                    105: %left SSTAR SSLASH
                    106: %right SPOWER
                    107: 
                    108: %start program
                    109: %type <labval> thislabel label assignlabel
                    110: %type <tagval> other inelt
                    111: %type <ival> lengspec type typespec typename dcl letter addop relop stop nameeq
                    112: %type <charpval> filename
                    113: %type <chval> namelistlist funarglist funargs dospec
                    114: %type <chval> callarglist arglist args exprlist inlist outlist out2 substring
                    115: %type <namval> name arg call var entryname progname
                    116: %type <expval> lhs expr uexpr opt_expr fexpr unpar_fexpr
                    117: %type <expval> ubound callarg complex_const simple_const 
                    118: %type <extval> common comblock
                    119: %type <eqvval> equivlist
                    120: %type <expval> datavalue real_const unsignedreal bit_const
                    121: %type <vexpval> unsignedint int_const
                    122: %type <vexpval> dataname
                    123: %type <vexpval> iconprimary iconfactor iconterm iconexpr opticonexpr
                    124: %type <drvals> datarval datarvals
                    125: %type <dvals>  iconexprlist datasubs
                    126: %type <deltp>  dataelt dataimplieddo datalval
                    127: %type <rpairp> datarange
                    128: %type <elistp> dlist datalvals
                    129: 
                    130: %%
                    131: 
                    132: program:
                    133:        | program stat SEOS
                    134:        ;
                    135: 
                    136: stat:    thislabel  entry
                    137:                { lastwasbranch = NO; }
                    138:        | thislabel  spec
                    139:        | thislabel  exec
                    140:                { if($1 && ($1->labelno==dorange))
                    141:                        enddo($1->labelno);
                    142:                  if(lastwasbranch && thislabel==NULL)
                    143:                        warn("statement cannot be reached");
                    144:                  lastwasbranch = thiswasbranch;
                    145:                  thiswasbranch = NO;
                    146:                  if($1)
                    147:                        {
                    148:                        if($1->labtype == LABFORMAT)
                    149:                                err("label already that of a format");
                    150:                        else
                    151:                                $1->labtype = LABEXEC;
                    152:                        }
                    153:                  if(!optimflag)
                    154:                        {
                    155:                        argtemplist = hookup(argtemplist, activearglist);
                    156:                        activearglist = CHNULL;
                    157:                        }
                    158:                }
                    159:        | thislabel SINCLUDE filename
                    160:                { doinclude( $3 ); }
                    161:        | thislabel  SEND  end_spec
                    162:                { lastwasbranch = NO;  endproc(); }
                    163:        | thislabel SUNKNOWN
                    164:                { execerr("unclassifiable statement", CNULL);  flline(); };
                    165:        | error
                    166:                { flline();  needkwd = NO;  inioctl = NO; 
                    167:                  yyerrok; yyclearin; }
                    168:        ;
                    169: 
                    170: thislabel:  SLABEL
                    171:                {
                    172: #ifdef SDB
                    173:                if( sdbflag )
                    174:                        {
                    175:                        linenostab(lineno);
                    176:                        }
                    177: #endif
                    178: 
                    179:                if(yystno != 0)
                    180:                        {
                    181:                        $$ = thislabel =  mklabel(yystno);
                    182:                        if(thislabel->labdefined)
                    183:                                execerr("label %s already defined",
                    184:                                        convic(thislabel->stateno) );
                    185:                        else    {
                    186:                                if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
                    187:                                    && thislabel->labtype!=LABFORMAT)
                    188:                                        warn1("there is a branch to label %s from outside block",
                    189:                                              convic( (ftnint) (thislabel->stateno) ) );
                    190:                                thislabel->blklevel = blklevel;
                    191:                                thislabel->labdefined = YES;
                    192:                                }
                    193:                        }
                    194:                else    $$ = thislabel = NULL;
                    195:                }
                    196:        ;
                    197: 
                    198: entry:   SPROGRAM new_proc progname
                    199:                   {startproc($3, CLMAIN); }
                    200:        | SBLOCK new_proc progname
                    201:                { if($3) NO66("named BLOCKDATA");
                    202:                  startproc($3, CLBLOCK); }
                    203:        | SSUBROUTINE new_proc entryname arglist
                    204:                { entrypt(CLPROC, TYSUBR, (ftnint) 0,  $3, $4); }
                    205:        | SFUNCTION new_proc entryname arglist
                    206:                { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
                    207:        | type SFUNCTION new_proc entryname arglist
                    208:                { entrypt(CLPROC, $1, varleng, $4, $5); }
                    209:        | SENTRY entryname arglist
                    210:                { if(parstate==OUTSIDE || procclass==CLMAIN
                    211:                        || procclass==CLBLOCK)
                    212:                                execerr("misplaced entry statement", CNULL);
                    213:                        entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
                    214:                }
                    215:        ;
                    216: 
                    217: new_proc:
                    218:                { newproc(); }
                    219:        ;
                    220: 
                    221: entryname:  name
                    222:        ;
                    223: 
                    224: name:    SNAME
                    225:                { $$ = mkname(toklen, token); }
                    226:        ;
                    227: 
                    228: progname:              { $$ = NULL; }
                    229:        | entryname
                    230:        ;
                    231: 
                    232: arglist:
                    233:                { $$ = 0; }
                    234:        | SLPAR SRPAR
                    235:                { NO66(" () argument list");
                    236:                  $$ = 0; }
                    237:        | SLPAR args SRPAR
                    238:                {$$ = $2; }
                    239:        ;
                    240: 
                    241: args:    arg
                    242:                { $$ = ($1 ? mkchain($1,CHNULL) : CHNULL ); }
                    243:        | args SCOMMA arg
                    244:                { if($3) $1 = $$ = hookup($1, mkchain($3,CHNULL)); }
                    245:        ;
                    246: 
                    247: arg:     name
                    248:                { if(($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG)
                    249:                                || ($1->vclass == CLPARAM) ) {
                    250:                        dclerr("name declared as argument after use", $1);
                    251:                        $$ = NULL;
                    252:                  } else
                    253:                        $1->vstg = STGARG;
                    254:                }
                    255:        | SSTAR
                    256:                { NO66("altenate return argument");
                    257:                  $$ = 0;  substars = YES; }
                    258:        ;
                    259: 
                    260: 
                    261: 
                    262: filename:   SHOLLERITH
                    263:                {
                    264:                char *s;
                    265:                s = copyn(toklen+1, token);
                    266:                s[toklen] = '\0';
                    267:                $$ = s;
                    268:                }
                    269:        ;

unix.superglobalmegacorp.com

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