|
|
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: #endif
11:
12: static int nstars;
13: static int ndim;
14: static int vartype;
15: static ftnint varleng;
16: static struct { ptr lb, ub; } dims[MAXDIM+1];
17: static struct Labelblock *labarray[MAXLABLIST];
18: static int lastwasbranch = NO;
19: static int thiswasbranch = NO;
20: extern ftnint yystno;
21:
22: ftnint convci();
23: double convcd();
24: struct Addrblock *nextdata(), *mkbitcon();
25: struct Constblock *mklogcon(), *mkaddcon(), *mkrealcon();
26: struct Constblock *mkstrcon(), *mkcxcon();
27: struct Listblock *mklist();
28: struct Listblock *mklist();
29: struct Impldoblock *mkiodo();
30: struct Extsym *comblock();
31:
32: %}
33:
34: /* Specify precedences and associativies. */
35:
36: %left SCOMMA
37: %nonassoc SCOLON
38: %right SEQUALS
39: %left SEQV SNEQV
40: %left SOR
41: %left SAND
42: %left SNOT
43: %nonassoc SLT SGT SLE SGE SEQ SNE
44: %left SCONCAT
45: %left SPLUS SMINUS
46: %left SSTAR SSLASH
47: %right SPOWER
48:
49: %%
50:
51: program:
52: | program stat SEOS
53: ;
54:
55: stat: thislabel entry
56: { lastwasbranch = NO; }
57: | thislabel spec
58: | thislabel exec
59: { if($1 && ($1->labelno==dorange))
60: enddo($1->labelno);
61: if(lastwasbranch && thislabel==NULL)
62: warn("statement cannot be reached");
63: lastwasbranch = thiswasbranch;
64: thiswasbranch = NO;
65: if($1)
66: {
67: if($1->labtype == LABFORMAT)
68: err("label already that of a format");
69: else
70: $1->labtype = LABEXEC;
71: }
72: }
73: | thislabel SINCLUDE filename
74: { doinclude( $3 ); }
75: | thislabel SEND end_spec
76: { lastwasbranch = NO; endproc(); }
77: | thislabel SUNKNOWN
78: { execerr("unclassifiable statement", 0); flline(); };
79: | error
80: { flline(); needkwd = NO; inioctl = NO;
81: yyerrok; yyclearin; }
82: ;
83:
84: thislabel: SLABEL
85: {
86: #ifdef SDB
87: char buff[10];
88: if( sdbflag )
89: {
90: # ifdef UCBVAXASM
91: p2pass( stabdline(N_SLINE, lineno) );
92: # else
93: sprintf(buff,"LL%d", ++dbglabel);
94: p2pass( stabline(0, N_SLINE, lineno, buff) );
95: p2pi("LL%d:\n", dbglabel);
96: # endif
97: }
98: #endif
99:
100: if(yystno != 0)
101: {
102: $$ = thislabel = mklabel(yystno);
103: if( ! headerdone )
104: puthead(NULL, procclass);
105: if(thislabel->labdefined)
106: execerr("label %s already defined",
107: convic(thislabel->stateno) );
108: else {
109: if(thislabel->blklevel!=0 && thislabel->blklevel<blklevel
110: && thislabel->labtype!=LABFORMAT)
111: warn1("there is a branch to label %s from outside block",
112: convic( (ftnint) (thislabel->stateno) ) );
113: thislabel->blklevel = blklevel;
114: thislabel->labdefined = YES;
115: if(thislabel->labtype != LABFORMAT)
116: putlabel(thislabel->labelno);
117: }
118: }
119: else $$ = thislabel = NULL;
120: }
121: ;
122:
123: entry: SPROGRAM new_proc progname
124: {startproc($3, CLMAIN); }
125: | SBLOCK new_proc progname
126: { if($3) NO66("named BLOCKDATA");
127: startproc($3, CLBLOCK); }
128: | SSUBROUTINE new_proc entryname arglist
129: { entrypt(CLPROC, TYSUBR, (ftnint) 0, $3, $4); }
130: | SFUNCTION new_proc entryname arglist
131: { entrypt(CLPROC, TYUNKNOWN, (ftnint) 0, $3, $4); }
132: | type SFUNCTION new_proc entryname arglist
133: { entrypt(CLPROC, $1, varleng, $4, $5); }
134: | SENTRY entryname arglist
135: { if(parstate==OUTSIDE || procclass==CLMAIN
136: || procclass==CLBLOCK)
137: execerr("misplaced entry statement", 0);
138: entrypt(CLENTRY, 0, (ftnint) 0, $2, $3);
139: }
140: ;
141:
142: new_proc:
143: { newproc(); }
144: ;
145:
146: entryname: name
147: { $$ = newentry($1); }
148: ;
149:
150: name: SNAME
151: { $$ = mkname(toklen, token); }
152: ;
153:
154: progname: { $$ = NULL; }
155: | entryname
156: ;
157:
158: arglist:
159: { $$ = 0; }
160: | SLPAR SRPAR
161: { NO66(" () argument list");
162: $$ = 0; }
163: | SLPAR args SRPAR
164: {$$ = $2; }
165: ;
166:
167: args: arg
168: { $$ = ($1 ? mkchain($1,0) : 0 ); }
169: | args SCOMMA arg
170: { if($3) $1 = $$ = hookup($1, mkchain($3,0)); }
171: ;
172:
173: arg: name
174: { if($1->vstg!=STGUNKNOWN && $1->vstg!=STGARG)
175: dclerr("name declared as argument after use", $1);
176: $1->vstg = STGARG;
177: }
178: | SSTAR
179: { NO66("altenate return argument");
180: $$ = 0; substars = YES; }
181: ;
182:
183:
184:
185: filename: SHOLLERITH
186: {
187: char *s;
188: s = copyn(toklen+1, token);
189: s[toklen] = '\0';
190: $$ = s;
191: }
192: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.