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

1.1       root        1: /****************************************************************
                      2: Copyright 1990, 1993 by AT&T Bell Laboratories, Bellcore.
                      3: 
                      4: Permission to use, copy, modify, and distribute this software
                      5: and its documentation for any purpose and without fee is hereby
                      6: granted, provided that the above copyright notice appear in all
                      7: copies and that both that the copyright notice and this
                      8: permission notice and warranty disclaimer appear in supporting
                      9: documentation, and that the names of AT&T Bell Laboratories or
                     10: Bellcore or any of their entities not be used in advertising or
                     11: publicity pertaining to distribution of the software without
                     12: specific, written prior permission.
                     13: 
                     14: AT&T and Bellcore disclaim all warranties with regard to this
                     15: software, including all implied warranties of merchantability
                     16: and fitness.  In no event shall AT&T or Bellcore be liable for
                     17: any special, indirect or consequential damages or any damages
                     18: whatsoever resulting from loss of use, data or profits, whether
                     19: in an action of contract, negligence or other tortious action,
                     20: arising out of or in connection with the use or performance of
                     21: this software.
                     22: ****************************************************************/
                     23: 
                     24: %{
                     25: #include "defs.h"
                     26: #include "p1defs.h"
                     27: 
                     28: static int nstars;                     /* Number of labels in an
                     29:                                           alternate return CALL */
                     30: static int datagripe;
                     31: static int ndim;
                     32: static int vartype;
                     33: int new_dcl;
                     34: static ftnint varleng;
                     35: static struct Dims dims[MAXDIM+1];
                     36: extern struct Labelblock **labarray;   /* Labels in an alternate
                     37:                                                   return CALL */
                     38: extern int maxlablist;
                     39: 
                     40: /* The next two variables are used to verify that each statement might be reached
                     41:    during runtime.   lastwasbranch   is tested only in the defintion of the
                     42:    stat:   nonterminal. */
                     43: 
                     44: int lastwasbranch = NO;
                     45: static int thiswasbranch = NO;
                     46: extern ftnint yystno;
                     47: extern flag intonly;
                     48: static chainp datastack;
                     49: extern long laststfcn, thisstno;
                     50: extern int can_include;        /* for netlib */
                     51: 
                     52: ftnint convci();
                     53: Addrp nextdata();
                     54: expptr mklogcon(), mkaddcon(), mkrealcon(), mkstrcon(), mkbitcon();
                     55: expptr mkcxcon();
                     56: struct Listblock *mklist();
                     57: struct Listblock *mklist();
                     58: struct Impldoblock *mkiodo();
                     59: Extsym *comblock();
                     60: #define ESNULL (Extsym *)0
                     61: #define NPNULL (Namep)0
                     62: #define LBNULL (struct Listblock *)0
                     63: extern void freetemps(), make_param();
                     64: 
                     65:  static void
                     66: pop_datastack() {
                     67:        chainp d0 = datastack;
                     68:        if (d0->datap)
                     69:                curdtp = (chainp)d0->datap;
                     70:        datastack = d0->nextp;
                     71:        d0->nextp = 0;
                     72:        frchain(&d0);
                     73:        }
                     74: 
                     75: %}
                     76: 
                     77: /* Specify precedences and associativities. */
                     78: 
                     79: %union {
                     80:        int ival;
                     81:        ftnint lval;
                     82:        char *charpval;
                     83:        chainp chval;
                     84:        tagptr tagval;
                     85:        expptr expval;
                     86:        struct Labelblock *labval;
                     87:        struct Nameblock *namval;
                     88:        struct Eqvchain *eqvval;
                     89:        Extsym *extval;
                     90:        }
                     91: 
                     92: %left SCOMMA
                     93: %nonassoc SCOLON
                     94: %right SEQUALS
                     95: %left SEQV SNEQV
                     96: %left SOR
                     97: %left SAND
                     98: %left SNOT
                     99: %nonassoc SLT SGT SLE SGE SEQ SNE
                    100: %left SCONCAT
                    101: %left SPLUS SMINUS
                    102: %left SSTAR SSLASH
                    103: %right SPOWER
                    104: 
                    105: %start program
                    106: %type <labval> thislabel label assignlabel
                    107: %type <tagval> other inelt
                    108: %type <ival> type typespec typename dcl letter addop relop stop nameeq
                    109: %type <lval> lengspec
                    110: %type <charpval> filename
                    111: %type <chval> datavar datavarlist namelistlist funarglist funargs
                    112: %type <chval> dospec dospecw
                    113: %type <chval> callarglist arglist args exprlist inlist outlist out2 substring
                    114: %type <namval> name arg call var
                    115: %type <expval> lhs expr uexpr opt_expr fexpr unpar_fexpr
                    116: %type <expval> ubound simple value callarg complex_const simple_const bit_const
                    117: %type <extval> common comblock entryname progname
                    118: %type <eqvval> equivlist
                    119: 
                    120: %%
                    121: 
                    122: program:
                    123:        | program stat SEOS
                    124:        ;
                    125: 
                    126: stat:    thislabel  entry
                    127:                {
                    128: /* stat:   is the nonterminal for Fortran statements */
                    129: 
                    130:                  lastwasbranch = NO; }
                    131:        | thislabel  spec
                    132:        | thislabel  exec
                    133:                { /* forbid further statement function definitions... */
                    134:                  if (parstate == INDATA && laststfcn != thisstno)
                    135:                        parstate = INEXEC;
                    136:                  thisstno++;
                    137:                  if($1 && ($1->labelno==dorange))
                    138:                        enddo($1->labelno);
                    139:                  if(lastwasbranch && thislabel==NULL)
                    140:                        warn("statement cannot be reached");
                    141:                  lastwasbranch = thiswasbranch;
                    142:                  thiswasbranch = NO;
                    143:                  if($1)
                    144:                        {
                    145:                        if($1->labtype == LABFORMAT)
                    146:                                err("label already that of a format");
                    147:                        else
                    148:                                $1->labtype = LABEXEC;
                    149:                        }
                    150:                  freetemps();
                    151:                }
                    152:        | thislabel SINCLUDE filename
                    153:                { if (can_include)
                    154:                        doinclude( $3 );
                    155:                  else {
                    156:                        fprintf(diagfile, "Cannot open file %s\n", $3);
                    157:                        done(1);
                    158:                        }
                    159:                }
                    160:        | thislabel  SEND  end_spec
                    161:                { if ($1)
                    162:                        lastwasbranch = NO;
                    163:                  endproc(); /* lastwasbranch = NO; -- set in endproc() */
                    164:                }
                    165:        | thislabel SUNKNOWN
                    166:                { extern void unclassifiable();
                    167:                  unclassifiable();
                    168: 
                    169: /* flline flushes the current line, ignoring the rest of the text there */
                    170: 
                    171:                  flline(); };
                    172:        | error
                    173:                { flline();  needkwd = NO;  inioctl = NO;
                    174:                  yyerrok; yyclearin; }
                    175:        ;
                    176: 
                    177: thislabel:  SLABEL
                    178:                {
                    179:                if(yystno != 0)
                    180:                        {
                    181:                        $$ = thislabel =  mklabel(yystno);
                    182:                        if( ! headerdone ) {
                    183:                                if (procclass == CLUNKNOWN)
                    184:                                        procclass = CLMAIN;
                    185:                                puthead(CNULL, procclass);
                    186:                                }
                    187:                        if(thislabel->labdefined)
                    188:                                execerr("label %s already defined",
                    189:                                        convic(thislabel->stateno) );
                    190:                        else    {
                    191:                                if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
                    192:                                    && thislabel->labtype!=LABFORMAT)
                    193:                                        warn1("there is a branch to label %s from outside block",
                    194:                                              convic( (ftnint) (thislabel->stateno) ) );
                    195:                                thislabel->blklevel = blklevel;
                    196:                                thislabel->labdefined = YES;
                    197:                                if(thislabel->labtype != LABFORMAT)
                    198:                                        p1_label((long)(thislabel - labeltab));
                    199:                                }
                    200:                        }
                    201:                else    $$ = thislabel = NULL;
                    202:                }
                    203:        ;
                    204: 
                    205: entry:   SPROGRAM new_proc progname
                    206:                   {startproc($3, CLMAIN); }
                    207:        | SPROGRAM new_proc progname progarglist
                    208:                   {    warn("ignoring arguments to main program");
                    209:                        /* hashclear(); */
                    210:                        startproc($3, CLMAIN); }
                    211:        | SBLOCK new_proc progname
                    212:                { if($3) NO66("named BLOCKDATA");
                    213:                  startproc($3, CLBLOCK); }
                    214:        | SSUBROUTINE new_proc entryname arglist
                    215:                { entrypt(CLPROC, TYSUBR, (ftnint) 0,  $3, $4); }
                    216:        | SFUNCTION new_proc entryname arglist
                    217:                { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
                    218:        | type SFUNCTION new_proc entryname arglist
                    219:                { entrypt(CLPROC, $1, varleng, $4, $5); }
                    220:        | SENTRY entryname arglist
                    221:                 { if(parstate==OUTSIDE || procclass==CLMAIN
                    222:                        || procclass==CLBLOCK)
                    223:                                execerr("misplaced entry statement", CNULL);
                    224:                  entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
                    225:                }
                    226:        ;
                    227: 
                    228: new_proc:
                    229:                { newproc(); }
                    230:        ;
                    231: 
                    232: entryname:  name
                    233:                { $$ = newentry($1, 1); }
                    234:        ;
                    235: 
                    236: name:    SNAME
                    237:                { $$ = mkname(token); }
                    238:        ;
                    239: 
                    240: progname:              { $$ = NULL; }
                    241:        | entryname
                    242:        ;
                    243: 
                    244: progarglist:
                    245:          SLPAR SRPAR
                    246:        | SLPAR progargs SRPAR
                    247:        ;
                    248: 
                    249: progargs: progarg
                    250:        | progargs SCOMMA progarg
                    251:        ;
                    252: 
                    253: progarg:  SNAME
                    254:        | SNAME SEQUALS SNAME
                    255:        ;
                    256: 
                    257: arglist:
                    258:                { $$ = 0; }
                    259:        | SLPAR SRPAR
                    260:                { NO66(" () argument list");
                    261:                  $$ = 0; }
                    262:        | SLPAR args SRPAR
                    263:                {$$ = $2; }
                    264:        ;
                    265: 
                    266: args:    arg
                    267:                { $$ = ($1 ? mkchain((char *)$1,CHNULL) : CHNULL ); }
                    268:        | args SCOMMA arg
                    269:                { if($3) $1 = $$ = mkchain((char *)$3, $1); }
                    270:        ;
                    271: 
                    272: arg:     name
                    273:                { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG)
                    274:                        dclerr("name declared as argument after use", $1);
                    275:                  $1->vstg = STGARG;
                    276:                }
                    277:        | SSTAR
                    278:                { NO66("altenate return argument");
                    279: 
                    280: /* substars   means that '*'ed formal parameters should be replaced.
                    281:    This is used to specify alternate return labels; in theory, only
                    282:    parameter slots which have '*' should accept the statement labels.
                    283:    This compiler chooses to ignore the '*'s in the formal declaration, and
                    284:    always return the proper value anyway.
                    285: 
                    286:    This variable is only referred to in   proc.c   */
                    287: 
                    288:                  $$ = 0;  substars = YES; }
                    289:        ;
                    290: 
                    291: 
                    292: 
                    293: filename:   SHOLLERITH
                    294:                {
                    295:                char *s;
                    296:                s = copyn(toklen+1, token);
                    297:                s[toklen] = '\0';
                    298:                $$ = s;
                    299:                }
                    300:        ;

unix.superglobalmegacorp.com

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