Annotation of researchv10no/cmd/f77/gram.head, revision 1.1.1.1

1.1       root        1: %{
                      2: #      include "defs"
                      3: 
                      4: #ifdef SDB
                      5: #      include <a.out.h>
                      6: char *stabline();
                      7: #      ifdef UCBVAXASM
                      8:                char *stabdline();
                      9: #      endif
                     10: 
                     11: #      ifndef N_SO
                     12: #              include <stab.h>
                     13: #      endif
                     14: #endif
                     15: 
                     16: static int nstars;
                     17: static int ndim;
                     18: static int vartype;
                     19: static ftnint varleng;
                     20: static struct { expptr lb, ub; } dims[MAXDIM+1];
                     21: static struct Labelblock *labarray[MAXLABLIST];
                     22: static int lastwasbranch = NO;
                     23: static int thiswasbranch = NO;
                     24: static int hadcomma;
                     25: extern ftnint yystno;
                     26: extern flag intonly;
                     27: static chainp datastack;
                     28: extern long laststfcn, thisstno;
                     29: 
                     30: ftnint convci();
                     31: double convcd();
                     32: Addrp nextdata();
                     33: expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon();
                     34: expptr mkcxcon();
                     35: struct Listblock *mklist();
                     36: struct Listblock *mklist();
                     37: struct Impldoblock *mkiodo();
                     38: struct Extsym *comblock();
                     39: 
                     40:  static void
                     41: pop_datastack() {
                     42:        chainp d0 = datastack;
                     43:        if (d0->datap && !(bugwarn & 2)) {
                     44:                if (bugwarn)
                     45:                        warnb("old f77 incorrectly parsed this data statement");
                     46:                curdtp = (chainp)d0->datap;
                     47:                }
                     48:        datastack = d0->nextp;
                     49:        d0->nextp = 0;
                     50:        frchain(&d0);
                     51:        }
                     52: 
                     53: 
                     54: 
                     55: %}
                     56: 
                     57: /* Specify precedences and associativities. */
                     58: 
                     59: %union {
                     60:        int ival;
                     61:        char *charpval;
                     62:        chainp chval;
                     63:        tagptr tagval;
                     64:        expptr expval;
                     65:        struct Labelblock *labval;
                     66:        struct Nameblock *namval;
                     67:        struct Eqvchain *eqvval;
                     68:        struct Extsym *extval;
                     69:        }
                     70: 
                     71: %left SCOMMA
                     72: %nonassoc SCOLON
                     73: %right SEQUALS
                     74: %left SEQV SNEQV
                     75: %left SOR
                     76: %left SAND
                     77: %left SNOT
                     78: %nonassoc SLT SGT SLE SGE SEQ SNE
                     79: %left SCONCAT
                     80: %left SPLUS SMINUS
                     81: %left SSTAR SSLASH
                     82: %right SPOWER
                     83: 
                     84: %start program
                     85: %type <labval> thislabel label assignlabel
                     86: %type <tagval> other inelt
                     87: %type <ival> lengspec type typespec typename dcl letter addop relop stop nameeq
                     88: %type <charpval> filename
                     89: %type <chval> datavar datavarlist namelistlist funarglist funargs dospec
                     90: %type <chval> callarglist arglist args exprlist inlist outlist out2 substring
                     91: %type <namval> name arg call var
                     92: %type <expval> lhs expr uexpr opt_expr fexpr unpar_fexpr
                     93: %type <expval> ubound simple value callarg complex_const simple_const bit_const
                     94: %type <extval> common comblock entryname progname
                     95: %type <eqvval> equivlist
                     96: 
                     97: %%
                     98: 
                     99: program:
                    100:        | program stat SEOS
                    101:        ;
                    102: 
                    103: stat:    thislabel  entry
                    104:                { lastwasbranch = NO; }
                    105:        | thislabel  spec
                    106:        | thislabel  exec
                    107:                { /* forbid further statement function definitions... */
                    108:                  if (parstate == INDATA
                    109:                                && laststfcn != thisstno
                    110:                                && !(bugwarn & 2))
                    111:                        parstate = INEXEC;
                    112:                  thisstno++;
                    113:                  if($1 && ($1->labelno==dorange))
                    114:                        enddo($1->labelno);
                    115:                  if(lastwasbranch && thislabel==NULL)
                    116:                        warn("statement cannot be reached");
                    117:                  lastwasbranch = thiswasbranch;
                    118:                  thiswasbranch = NO;
                    119:                  if($1)
                    120:                        {
                    121:                        if($1->labtype == LABFORMAT)
                    122:                                err("label already that of a format");
                    123:                        else
                    124:                                $1->labtype = LABEXEC;
                    125:                        }
                    126:                }
                    127:        | thislabel SINCLUDE filename
                    128:                { doinclude( $3 ); }
                    129:        | thislabel  SEND  end_spec
                    130:                { lastwasbranch = NO;  endproc(); }
                    131:        | thislabel SUNKNOWN
                    132:                { execerr("unclassifiable statement", CNULL);  flline(); };
                    133:        | error
                    134:                { flline();  needkwd = NO;  inioctl = NO; 
                    135:                  yyerrok; yyclearin; }
                    136:        ;
                    137: 
                    138: thislabel:  SLABEL
                    139:                {
                    140: #ifdef SDB
                    141:                if( sdbflag && parstate >= INDATA )
                    142:                        {
                    143: #      ifdef UCBVAXASM
                    144:                        p2pass( stabdline(N_SLINE, lineno) );
                    145: #      else
                    146:                        char buff[10];
                    147:                        sprintf(buff,"LL%d", ++dbglabel);
                    148:                        p2pass( stabline(0, N_SLINE, lineno, buff) );
                    149:                        p2pi("LL%d:\n", dbglabel);
                    150: #      endif
                    151:                        }
                    152: #endif
                    153: 
                    154:                if(yystno != 0)
                    155:                        {
                    156:                        $$ = thislabel =  mklabel(yystno);
                    157:                        if( ! headerdone )
                    158:                                puthead(CNULL, procclass);
                    159:                        if(thislabel->labdefined)
                    160:                                execerr("label %s already defined",
                    161:                                        convic(thislabel->stateno) );
                    162:                        else    {
                    163:                                if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
                    164:                                    && thislabel->labtype!=LABFORMAT)
                    165:                                        warn1("there is a branch to label %s from outside block",
                    166:                                              convic( (ftnint) (thislabel->stateno) ) );
                    167:                                thislabel->blklevel = blklevel;
                    168:                                thislabel->labdefined = YES;
                    169:                                if(thislabel->labtype != LABFORMAT)
                    170:                                        putlabel(thislabel->labelno);
                    171:                                }
                    172:                        }
                    173:                else    $$ = thislabel = NULL;
                    174:                }
                    175:        ;
                    176: 
                    177: entry:   SPROGRAM new_proc progname
                    178:                   {startproc($3, CLMAIN); }
                    179:        | SBLOCK new_proc progname
                    180:                { if($3) NO66("named BLOCKDATA");
                    181:                  startproc($3, CLBLOCK); }
                    182:        | SSUBROUTINE new_proc entryname arglist
                    183:                { entrypt(CLPROC, TYSUBR, (ftnint) 0,  $3, $4); }
                    184:        | SFUNCTION new_proc entryname arglist
                    185:                { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
                    186:        | type SFUNCTION new_proc entryname arglist
                    187:                { entrypt(CLPROC, $1, varleng, $4, $5); }
                    188:        | SENTRY entryname arglist
                    189:                 { if(parstate==OUTSIDE || procclass==CLMAIN
                    190:                        || procclass==CLBLOCK)
                    191:                                execerr("misplaced entry statement", CNULL);
                    192:                  entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
                    193:                }
                    194:        ;
                    195: 
                    196: new_proc:
                    197:                { newproc(); }
                    198:        ;
                    199: 
                    200: entryname:  name
                    201:                { $$ = newentry($1); }
                    202:        ;
                    203: 
                    204: name:    SNAME
                    205:                { $$ = mkname(toklen, token); }
                    206:        ;
                    207: 
                    208: progname:              { $$ = NULL; }
                    209:        | entryname
                    210:        ;
                    211: 
                    212: arglist:
                    213:                { $$ = 0; }
                    214:        | SLPAR SRPAR
                    215:                { NO66(" () argument list");
                    216:                  $$ = 0; }
                    217:        | SLPAR args SRPAR
                    218:                {$$ = $2; }
                    219:        ;
                    220: 
                    221: args:    arg
                    222:                { $$ = ($1 ? mkchain($1,CHNULL) : CHNULL ); }
                    223:        | args SCOMMA arg
                    224:                { if($3) $1 = $$ = hookup($1, mkchain($3,CHNULL)); }
                    225:        ;
                    226: 
                    227: arg:     name
                    228:                { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG)
                    229:                        dclerr("name declared as argument after use", $1);
                    230:                  $1->vstg = STGARG;
                    231:                }
                    232:        | SSTAR
                    233:                { NO66("altenate return argument");
                    234:                  $$ = 0;  substars = YES; }
                    235:        ;
                    236: 
                    237: 
                    238: 
                    239: filename:   SHOLLERITH
                    240:                {
                    241:                char *s;
                    242:                s = copyn(toklen+1, token);
                    243:                s[toklen] = '\0';
                    244:                $$ = s;
                    245:                }
                    246:        ;

unix.superglobalmegacorp.com

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