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