xref: /original-bsd/usr.bin/f77/pass1.vax/gram.io (revision 2301fdfb)
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.io	5.1 (Berkeley) 06/07/85
7 */
8
9  /*  Input/Output Statements */
10
11io:	  io1
12		{ endio(); }
13	;
14
15io1:	  iofmove ioctl
16	| iofmove unpar_fexpr
17		{ ioclause(IOSUNIT, $2); endioctl(); }
18	| iofmove SSTAR
19		{ ioclause(IOSUNIT, PNULL); endioctl(); }
20	| iofmove SPOWER
21		{ ioclause(IOSUNIT, IOSTDERR); endioctl(); }
22	| iofctl ioctl
23	| read ioctl
24		{ doio(PNULL); }
25	| read infmt
26		{ doio(PNULL); }
27	| read ioctl inlist
28		{ doio($3); }
29	| read infmt SCOMMA inlist
30		{ doio($4); }
31	| read ioctl SCOMMA inlist
32		{ doio($4); }
33	| write ioctl
34		{ doio(PNULL); }
35	| write ioctl outlist
36		{ doio($3); }
37	| print
38		{ doio(PNULL); }
39	| print SCOMMA outlist
40		{ doio($3); }
41	;
42
43iofmove:   fmkwd end_spec in_ioctl
44	;
45
46fmkwd:	  SBACKSPACE
47		{ iostmt = IOBACKSPACE; }
48	| SREWIND
49		{ iostmt = IOREWIND; }
50	| SENDFILE
51		{ iostmt = IOENDFILE; }
52	;
53
54iofctl:  ctlkwd end_spec in_ioctl
55	;
56
57ctlkwd:	  SINQUIRE
58		{ iostmt = IOINQUIRE; }
59	| SOPEN
60		{ iostmt = IOOPEN; }
61	| SCLOSE
62		{ iostmt = IOCLOSE; }
63	;
64
65infmt:	  unpar_fexpr
66		{
67		ioclause(IOSUNIT, PNULL);
68		ioclause(IOSFMT, $1);
69		endioctl();
70		}
71	| SSTAR
72		{
73		ioclause(IOSUNIT, PNULL);
74		ioclause(IOSFMT, PNULL);
75		endioctl();
76		}
77	;
78
79ioctl:	  SLPAR fexpr SRPAR
80		{ if($2->headblock.vtype == TYCHAR)
81			{
82			ioclause(IOSUNIT, PNULL);
83			ioclause(IOSFMT, $2);
84			}
85		  else
86			ioclause(IOSUNIT, $2);
87		  endioctl();
88		}
89	| SLPAR ctllist SRPAR
90		{ endioctl(); }
91	;
92
93ctllist:  ioclause
94	| ctllist SCOMMA ioclause
95	;
96
97ioclause:  fexpr
98		{ ioclause(IOSPOSITIONAL, $1); }
99	| SSTAR
100		{ ioclause(IOSPOSITIONAL, PNULL); }
101	| SPOWER
102		{ ioclause(IOSPOSITIONAL, IOSTDERR); }
103	| nameeq expr
104		{ ioclause($1, $2); }
105	| nameeq SSTAR
106		{ ioclause($1, PNULL); }
107	| nameeq SPOWER
108		{ ioclause($1, IOSTDERR); }
109	;
110
111nameeq:  SNAMEEQ
112		{ $$ = iocname(); }
113	;
114
115read:	  SREAD end_spec in_ioctl
116		{ iostmt = IOREAD; }
117	;
118
119write:	  SWRITE end_spec in_ioctl
120		{ iostmt = IOWRITE; }
121	;
122
123print:	  SPRINT end_spec fexpr in_ioctl
124		{
125		iostmt = IOWRITE;
126		ioclause(IOSUNIT, PNULL);
127		ioclause(IOSFMT, $3);
128		endioctl();
129		}
130	| SPRINT end_spec SSTAR in_ioctl
131		{
132		iostmt = IOWRITE;
133		ioclause(IOSUNIT, PNULL);
134		ioclause(IOSFMT, PNULL);
135		endioctl();
136		}
137	;
138
139inlist:	  inelt
140		{ $$ = mkchain($1, CHNULL); }
141	| inlist SCOMMA inelt
142		{ $$ = hookup($1, mkchain($3, CHNULL)); }
143	;
144
145inelt:	  lhs
146		{ $$ = (tagptr) $1; }
147	| SLPAR inlist SCOMMA dospec SRPAR
148		{ $$ = (tagptr) mkiodo($4,$2); }
149	;
150
151outlist:  uexpr
152		{ $$ = mkchain($1, CHNULL); }
153	| other
154		{ $$ = mkchain($1, CHNULL); }
155	| out2
156	;
157
158out2:	  uexpr SCOMMA uexpr
159		{ $$ = mkchain($1, mkchain($3, CHNULL) ); }
160	| uexpr SCOMMA other
161		{ $$ = mkchain($1, mkchain($3, CHNULL) ); }
162	| other SCOMMA uexpr
163		{ $$ = mkchain($1, mkchain($3, CHNULL) ); }
164	| other SCOMMA other
165		{ $$ = mkchain($1, mkchain($3, CHNULL) ); }
166	| out2  SCOMMA uexpr
167		{ $$ = hookup($1, mkchain($3, CHNULL) ); }
168	| out2  SCOMMA other
169		{ $$ = hookup($1, mkchain($3, CHNULL) ); }
170	;
171
172other:	  complex_const
173		{ $$ = (tagptr) $1; }
174	| SLPAR uexpr SCOMMA dospec SRPAR
175		{ $$ = (tagptr) mkiodo($4, mkchain($2, CHNULL) ); }
176	| SLPAR other SCOMMA dospec SRPAR
177		{ $$ = (tagptr) mkiodo($4, mkchain($2, CHNULL) ); }
178	| SLPAR out2  SCOMMA dospec SRPAR
179		{ $$ = (tagptr) mkiodo($4, $2); }
180	;
181
182in_ioctl:
183		{ startioctl(); }
184	;
185