xref: /csrg-svn/usr.bin/pascal/src/pas.y (revision 14752)
1798Speter /* Copyright (c) 1979 Regents of the University of California */
2798Speter 
3798Speter /*
4798Speter  * Yacc grammar for UNIX Pascal
5798Speter  *
6798Speter  * This grammar is processed by the commands in the shell script
7798Speter  * "gram" to yield parse tables and semantic routines in the file
8798Speter  * "y.tab.c" and a header defining the lexical tokens in "yy.h".
9798Speter  *
10798Speter  * In order for the syntactic error recovery possible with this
11798Speter  * grammar to work, the grammar must be processed by a yacc which
12798Speter  * has been modified to fully enumerate possibilities in states
13798Speter  * which involve the symbol "error".
14798Speter  * The parser used for Pascal also uses a different encoding of
15798Speter  * the test entries in the action table which speeds the parse.
16798Speter  * A version of yacc which will work for Pascal is included on
17798Speter  * the distribution table as "eyacc".
18798Speter  *
19798Speter  * The "gram" script also makes the following changes to the "y.tab.c"
20798Speter  * file:
21798Speter  *
22798Speter  *	1) Causes yyval to be declared int *.
23798Speter  *
24798Speter  *	2) Loads the variable yypv into a register as yyYpv so that
25798Speter  *	   the arguments $1, ... are available as yyYpv[1] etc.
26798Speter  *	   This produces much smaller code in the semantic actions.
27798Speter  *
28798Speter  *	3) Deletes the unused array yysterm.
29798Speter  *
30798Speter  *	4) Moves the declarations up to the flag line containing
31798Speter  *	   '##' to the file yy.h so that the routines which use
32798Speter  *	   these "magic numbers" don't have to all be compiled at
33798Speter  *	   the same time.
34798Speter  *
35798Speter  *	5) Creates the semantic restriction checking routine yyEactr
36804Speter  *	   by processing action lines containing `@@'.
37798Speter  *
38798Speter  * This compiler uses a different version of the yacc parser, a
39798Speter  * different yyerror which is called yerror, and requires more
40798Speter  * lookahead sets than normally provided by yacc.
41798Speter  *
42798Speter  * Source for the yacc used with this grammar is included on
43798Speter  * distribution tapes.
44798Speter  */
45798Speter 
46798Speter /*
47798Speter  * TERMINAL DECLARATIONS
48798Speter  *
49798Speter  * Some of the terminal declarations are out of the most natural
50798Speter  * alphabetic order because the error recovery
51798Speter  * will guess the first of equal cost non-terminals.
52798Speter  * This makes, e.g. YTO preferable to YDOWNTO.
53798Speter  */
54798Speter 
55798Speter %term
56798Speter 	YAND		YARRAY		YBEGIN		YCASE
57798Speter 	YCONST		YDIV		YDO		YDOTDOT
58798Speter 	YTO		YELSE		YEND		YFILE
5912932Speter 	YFOR		YFORWARD	YPROCEDURE	YGOTO
60798Speter 	YID		YIF		YIN		YINT
61798Speter 	YLABEL		YMOD		YNOT		YNUMB
62798Speter 	YOF		YOR		YPACKED		YNIL
6312932Speter 	YFUNCTION	YPROG		YRECORD		YREPEAT
64798Speter 	YSET		YSTRING		YTHEN		YDOWNTO
65798Speter 	YTYPE		YUNTIL		YVAR		YWHILE
66798Speter 	YWITH		YBINT		YOCT		YHEX
677927Smckusick 	YCASELAB	YILLCH		YEXTERN		YLAST
68798Speter 
69798Speter /*
70798Speter  * PRECEDENCE DECLARATIONS
71798Speter  *
72798Speter  * Highest precedence is the unary logical NOT.
73798Speter  * Next are the multiplying operators, signified by '*'.
74798Speter  * Lower still are the binary adding operators, signified by '+'.
75798Speter  * Finally, at lowest precedence and non-associative are the relationals.
76798Speter  */
77798Speter 
78798Speter %binary	'<'	'='	'>'	YIN
79798Speter %left	'+'	'-'	YOR	'|'
80798Speter %left	UNARYSIGN
81798Speter %left	'*'	'/'	YDIV	YMOD	YAND	'&'
82798Speter %left	YNOT
83798Speter 
84798Speter %{
85798Speter /*
86798Speter  * GLOBALS FOR ACTIONS
87798Speter  */
88798Speter 
89798Speter /* Copyright (c) 1979 Regents of the University of California */
90798Speter 
91*14752Sthien #ifndef lint
92*14752Sthien static	char sccsid[] = "@(#)pas.y 1.11 08/19/83";
93*14752Sthien #endif
94798Speter 
95798Speter /*
96798Speter  * The following line marks the end of the yacc
97798Speter  * Constant definitions which are removed from
98798Speter  * y.tab.c and placed in the file y.tab.h.
99798Speter  */
100798Speter ##
101798Speter /* Copyright (c) 1979 Regents of the University of California */
102798Speter 
103*14752Sthien static	char sccsid[] = "@(#)pas.y 1.11 08/19/83";
104798Speter 
105798Speter #include "whoami.h"
106798Speter #include "0.h"
107*14752Sthien #include "tree_ty.h"		/* must be included for yy.h */
108798Speter #include "yy.h"
109798Speter #include "tree.h"
110798Speter 
111798Speter #ifdef PI
112798Speter #define	lineof(l)	l
113798Speter #define	line2of(l)	l
114798Speter #endif
115798Speter 
116798Speter %}
117798Speter 
118798Speter %%
119798Speter 
120798Speter /*
121798Speter  * PRODUCTIONS
122798Speter  */
123798Speter 
124798Speter goal:
125837Speter 	prog_hedr decls block '.'
126*14752Sthien 		= funcend($1.nl_entry, $3.tr_entry, lineof($4.i_entry));
127798Speter 		|
128837Speter 	decls
129798Speter 		= segend();
130798Speter 		;
131798Speter 
132798Speter 
133798Speter prog_hedr:
134798Speter 	YPROG YID '(' id_list ')' ';'
135*14752Sthien 		= $$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry), $2.tr_entry, fixlist($4.tr_entry), TR_NIL)));
136798Speter 		|
1377953Speter 	YPROG YID ';'
138*14752Sthien 		= $$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry),  $2.tr_entry, TR_NIL, TR_NIL)));
1397953Speter 		|
140798Speter 	YPROG error
141798Speter 		= {
142798Speter 			yyPerror("Malformed program statement", PPROG);
143798Speter 			/*
144798Speter 			 * Should make a program statement
145798Speter 			 * with "input" and "output" here.
146798Speter 			 */
147*14752Sthien 			$$.nl_entry = funcbody(funchdr(tree5(T_PROG, lineof($1.i_entry), TR_NIL, TR_NIL, TR_NIL)));
148798Speter 		  }
149798Speter 		;
150798Speter block:
151798Speter 	YBEGIN stat_list YEND
152798Speter 		= {
153*14752Sthien 			$$.tr_entry = tree3(T_BSTL, lineof($1.i_entry), fixlist($2.tr_entry));
154*14752Sthien 			if ($3.i_entry < 0)
155*14752Sthien 				brerror($1.i_entry, "begin");
156798Speter 		  }
157798Speter 		;
158798Speter 
159798Speter 
160798Speter /*
161798Speter  * DECLARATION PART
162798Speter  */
163798Speter decls:
164798Speter 	decls decl
165798Speter 		= trfree();
166798Speter 		|
167798Speter 	decls error
168798Speter 		= {
169798Speter 			constend(), typeend(), varend(), trfree();
170798Speter 			yyPerror("Malformed declaration", PDECL);
171798Speter 		  }
172798Speter 		|
173798Speter 	/* lambda */
174798Speter 		= trfree();
175798Speter 		;
176798Speter 
177798Speter decl:
178798Speter 	labels
179798Speter 		|
180798Speter 	const_decl
181798Speter 		= constend();
182798Speter 		|
183798Speter 	type_decl
184798Speter 		= typeend();
185798Speter 		|
186798Speter 	var_decl
187798Speter 		= varend();
188837Speter 		|
189837Speter 	proc_decl
190798Speter 		;
191798Speter 
192798Speter /*
193798Speter  * LABEL PART
194798Speter  */
195798Speter 
196798Speter labels:
197798Speter 	YLABEL label_decl ';'
198*14752Sthien 		= label(fixlist($2.tr_entry), lineof($1.i_entry));
199798Speter 		;
200798Speter label_decl:
201798Speter 	YINT
202*14752Sthien 		= $$.tr_entry = newlist($1.i_entry == NIL ? TR_NIL :
203*14752Sthien 					(struct tnode *) *hash($1.cptr, 1));
204798Speter 		|
205798Speter 	label_decl ',' YINT
206*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.i_entry == NIL ?
207*14752Sthien 				TR_NIL : (struct tnode *) *hash($3.cptr, 1));
208798Speter 		;
209798Speter 
210798Speter /*
211798Speter  * CONST PART
212798Speter  */
213798Speter 
214798Speter const_decl:
215798Speter 	YCONST YID '=' const ';'
216*14752Sthien 		= constbeg($1.i_entry), const(lineof($3.i_entry), $2.cptr,
217*14752Sthien 						$4.tr_entry);
218798Speter 		|
219798Speter 	const_decl YID '=' const ';'
220*14752Sthien 		= const(lineof($3.i_entry), $2.cptr, $4.tr_entry);
221798Speter 		|
222798Speter 	YCONST error
223798Speter 		= {
224*14752Sthien 			constbeg($1.i_entry);
225798Speter Cerror:
226798Speter 			yyPerror("Malformed const declaration", PDECL);
227798Speter 		  }
228798Speter 		|
229798Speter 	const_decl error
230798Speter 		= goto Cerror;
231798Speter 		;
232798Speter 
233798Speter /*
234798Speter  * TYPE PART
235798Speter  */
236798Speter 
237798Speter type_decl:
238798Speter 	YTYPE YID '=' type ';'
239*14752Sthien 		= typebeg($1.i_entry, line2of($2.i_entry)), type(lineof($3.i_entry), $2.cptr, $4.tr_entry);
240798Speter 		|
241798Speter 	type_decl YID '=' type ';'
242*14752Sthien 		= type(lineof($3.i_entry), $2.cptr, $4.tr_entry);
243798Speter 		|
244798Speter 	YTYPE error
245798Speter 		= {
246*14752Sthien 			typebeg($1.i_entry, line2of($1.i_entry));
247798Speter Terror:
248798Speter 			yyPerror("Malformed type declaration", PDECL);
249798Speter 		  }
250798Speter 		|
251798Speter 	type_decl error
252798Speter 		= goto Terror;
253798Speter 		;
254798Speter 
255798Speter /*
256798Speter  * VAR PART
257798Speter  */
258798Speter 
259798Speter var_decl:
260798Speter 	YVAR id_list ':' type ';'
261*14752Sthien 		= varbeg($1.i_entry, line2of($3.i_entry)), var(lineof($3.i_entry), fixlist($2.tr_entry), $4.tr_entry);
262798Speter 		|
263798Speter 	var_decl id_list ':' type ';'
264*14752Sthien 		= var(lineof($3.i_entry), fixlist($2.tr_entry), $4.tr_entry);
265798Speter 		|
266798Speter 	YVAR error
267798Speter 		= {
268*14752Sthien 			varbeg($1.i_entry, line2of($1.i_entry));
269798Speter Verror:
270798Speter 			yyPerror("Malformed var declaration", PDECL);
271798Speter 		  }
272798Speter 		|
273798Speter 	var_decl error
274798Speter 		= goto Verror;
275798Speter 		;
276798Speter 
277798Speter /*
278798Speter  * PROCEDURE AND FUNCTION DECLARATION PART
279798Speter  */
280798Speter 
281837Speter proc_decl:
282798Speter 	phead YFORWARD ';'
283*14752Sthien 		= funcfwd($1.nl_entry);
284798Speter 		|
285798Speter 	phead YEXTERN ';'
286*14752Sthien 		= (void) funcext($1.nl_entry);
287798Speter 		|
288837Speter 	pheadres decls block ';'
289*14752Sthien 		= funcend($1.nl_entry, $3.tr_entry, lineof($4.i_entry));
2908000Speter 		|
2918000Speter 	phead error
292798Speter 		;
293798Speter pheadres:
294798Speter 	phead
295*14752Sthien 		= (void) funcbody($1.nl_entry);
296798Speter 		;
297798Speter phead:
298798Speter 	porf YID params ftype ';'
299*14752Sthien 		= $$.nl_entry = funchdr(tree5($1.i_entry, lineof($5.i_entry),
300*14752Sthien 				$2.tr_entry, $3.tr_entry, $4.tr_entry));
301798Speter 		;
302798Speter porf:
303798Speter 	YPROCEDURE
304*14752Sthien 		= $$.i_entry = T_PDEC;
305798Speter 		|
306798Speter 	YFUNCTION
307*14752Sthien 		= $$.i_entry = T_FDEC;
308798Speter 		;
309798Speter params:
310798Speter 	'(' param_list ')'
311*14752Sthien 		= $$.tr_entry = fixlist($2.tr_entry);
312798Speter 		|
313798Speter 	/* lambda */
314*14752Sthien 		= $$.tr_entry = TR_NIL;
315798Speter 		;
316798Speter 
317798Speter /*
318798Speter  * PARAMETERS
319798Speter  */
320798Speter 
321798Speter param:
322798Speter 	id_list ':' type
323*14752Sthien 		= $$.tr_entry = tree3(T_PVAL, (int) fixlist($1.tr_entry), $3.tr_entry);
324798Speter 		|
325798Speter 	YVAR id_list ':' type
326*14752Sthien 		= $$.tr_entry = tree3(T_PVAR, (int) fixlist($2.tr_entry), $4.tr_entry);
327798Speter 		|
3283298Smckusic 	YFUNCTION id_list params ftype
329*14752Sthien 		= $$.tr_entry = tree5(T_PFUNC, (int) fixlist($2.tr_entry),
330*14752Sthien 				$4.tr_entry, $3.tr_entry,
331*14752Sthien 				(struct tnode *) lineof($1.i_entry));
332798Speter 		|
3333298Smckusic 	YPROCEDURE id_list params ftype
334*14752Sthien 		= $$.tr_entry = tree5(T_PPROC, (int) fixlist($2.tr_entry),
335*14752Sthien 				$4.tr_entry, $3.tr_entry,
336*14752Sthien 				(struct tnode *) lineof($1.i_entry));
337798Speter 		;
338798Speter ftype:
339798Speter 	':' type
340798Speter 		= $$ = $2;
341798Speter 		|
342798Speter 	/* lambda */
343*14752Sthien 		= $$.tr_entry = TR_NIL;
344798Speter 		;
345798Speter param_list:
346798Speter 	param
347*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
348798Speter 		|
349798Speter 	param_list ';' param
350*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
351798Speter 		;
352798Speter 
353798Speter /*
354798Speter  * CONSTANTS
355798Speter  */
356798Speter 
357798Speter const:
358798Speter 	YSTRING
359*14752Sthien 		= $$.tr_entry = tree2(T_CSTRNG, $1.i_entry);
360798Speter 		|
361798Speter 	number
362798Speter 		|
363798Speter 	'+' number
364*14752Sthien 		= $$.tr_entry = tree2(T_PLUSC, $2.i_entry);
365798Speter 		|
366798Speter 	'-' number
367*14752Sthien 		= $$.tr_entry = tree2(T_MINUSC, $2.i_entry);
368798Speter 		;
369798Speter number:
370798Speter 	const_id
371*14752Sthien 		= $$.tr_entry = tree2(T_ID, $1.i_entry);
372798Speter 		|
373798Speter 	YINT
374*14752Sthien 		= $$.tr_entry = tree2(T_CINT, $1.i_entry);
375798Speter 		|
376798Speter 	YBINT
377*14752Sthien 		= $$.tr_entry = tree2(T_CBINT, $1.i_entry);
378798Speter 		|
379798Speter 	YNUMB
380*14752Sthien 		= $$.tr_entry = tree2(T_CFINT, $1.i_entry);
381798Speter 		;
382798Speter const_list:
383798Speter 	const
384*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
385798Speter 		|
386798Speter 	const_list ',' const
387*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
388798Speter 		;
389798Speter 
390798Speter /*
391798Speter  * TYPES
392798Speter  */
393798Speter 
394798Speter type:
395798Speter 	simple_type
396798Speter 		|
397798Speter 	'^' YID
398*14752Sthien 		= $$.tr_entry = tree3(T_TYPTR, lineof($1.i_entry), tree2(T_ID,
399*14752Sthien 								$2.i_entry));
400798Speter 		|
401798Speter 	struct_type
402798Speter 		|
403798Speter 	YPACKED struct_type
404*14752Sthien 		= $$.tr_entry = tree3(T_TYPACK, lineof($1.i_entry), $2.tr_entry);
405798Speter 		;
406798Speter simple_type:
407798Speter 	type_id
408798Speter 		|
409798Speter 	'(' id_list ')'
410*14752Sthien 		= $$.tr_entry = tree3(T_TYSCAL, lineof($1.i_entry), fixlist($2.tr_entry));
411798Speter 		|
412798Speter 	const YDOTDOT const
413*14752Sthien 		= $$.tr_entry = tree4(T_TYRANG, lineof($2.i_entry), $1.tr_entry,
414*14752Sthien 				$3.tr_entry);
415798Speter 		;
416798Speter struct_type:
417798Speter 	YARRAY '[' simple_type_list ']' YOF type
418*14752Sthien 		= $$.tr_entry = tree4(T_TYARY, lineof($1.i_entry),
419*14752Sthien 					fixlist($3.tr_entry), $6.tr_entry);
420798Speter 		|
421798Speter 	YFILE YOF type
422*14752Sthien 		= $$.tr_entry = tree3(T_TYFILE, lineof($1.i_entry), $3.tr_entry);
423798Speter 		|
424798Speter 	YSET YOF simple_type
425*14752Sthien 		= $$.tr_entry = tree3(T_TYSET, lineof($1.i_entry), $3.tr_entry);
426798Speter 		|
427798Speter 	YRECORD field_list YEND
428798Speter 		= {
429*14752Sthien 			$$.tr_entry = setuptyrec( lineof( $1.i_entry ) , $2.tr_entry);
430*14752Sthien 			if ($3.i_entry < 0)
431*14752Sthien 				brerror($1.i_entry, "record");
432798Speter 		  }
433798Speter 		;
434798Speter simple_type_list:
435798Speter 	simple_type
436*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
437798Speter 		|
438798Speter 	simple_type_list ',' simple_type
439*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
440798Speter 		;
441798Speter 
442798Speter /*
443798Speter  * RECORD TYPE
444798Speter  */
445798Speter field_list:
446798Speter 	fixed_part variant_part
447*14752Sthien 		= $$.tr_entry = tree4(T_FLDLST, lineof(NIL),
448*14752Sthien 				fixlist($1.tr_entry), $2.tr_entry);
449798Speter 		;
450798Speter fixed_part:
451798Speter 	field
452*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
453798Speter 		|
454798Speter 	fixed_part ';' field
455*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
456798Speter 		|
457798Speter 	fixed_part error
458798Speter 		= yyPerror("Malformed record declaration", PDECL);
459798Speter 		;
460798Speter field:
461798Speter 	/* lambda */
462*14752Sthien 		= $$.tr_entry = TR_NIL;
463798Speter 		|
464798Speter 	id_list ':' type
465*14752Sthien 		= $$.tr_entry = tree4(T_RFIELD, lineof($2.i_entry),
466*14752Sthien 				fixlist($1.tr_entry), $3.tr_entry);
467798Speter 		;
468798Speter 
469798Speter variant_part:
470798Speter 	/* lambda */
471*14752Sthien 		= $$.tr_entry = TR_NIL;
472798Speter 		|
473798Speter 	YCASE type_id YOF variant_list
474*14752Sthien 		= $$.tr_entry = tree5(T_TYVARPT, lineof($1.i_entry), TR_NIL,
475*14752Sthien 				$2.tr_entry, fixlist($4.tr_entry));
476798Speter 		|
477798Speter 	YCASE YID ':' type_id YOF variant_list
478*14752Sthien 		= $$.tr_entry = tree5(T_TYVARPT, lineof($1.i_entry),
479*14752Sthien 				$2.tr_entry, $4.tr_entry,
480*14752Sthien 					fixlist($6.tr_entry));
481798Speter 		;
482798Speter variant_list:
483798Speter 	variant
484*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
485798Speter 		|
486798Speter 	variant_list ';' variant
487*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
488798Speter 		|
489798Speter 	variant_list error
490798Speter 		= yyPerror("Malformed record declaration", PDECL);
491798Speter 		;
492798Speter variant:
493798Speter 	/* lambda */
494*14752Sthien 		= $$.tr_entry = TR_NIL;
495798Speter 		|
496798Speter 	const_list ':' '(' field_list ')'
497*14752Sthien 		= $$.tr_entry = tree4(T_TYVARNT,lineof($2.i_entry), fixlist($1.tr_entry),
498*14752Sthien 				$4.tr_entry);
499798Speter 		;
500798Speter 
501798Speter /*
502798Speter  * STATEMENT LIST
503798Speter  */
504798Speter 
505798Speter stat_list:
506798Speter 	stat
507*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
508798Speter 		|
509798Speter 	stat_lsth stat
510798Speter 		= {
511*14752Sthien 			if ((p = $1.tr_entry) != TR_NIL && (q = p->list_node.list)->tag == T_IFX) {
512*14752Sthien 				q->tag = T_IFEL;
513*14752Sthien 				q->if_node.else_stmnt = $2.tr_entry;
514798Speter 			} else
515*14752Sthien 				$$.tr_entry= addlist($1.tr_entry, $2.tr_entry);
516798Speter 		  }
517798Speter 		;
518798Speter 
519798Speter stat_lsth:
520798Speter 	stat_list ';'
521*14752Sthien 		= if ((q = $1.tr_entry) != TR_NIL && (p = q->list_node.list) != TR_NIL && p->tag == T_IF) {
522798Speter 			if (yychar < 0)
523798Speter 				yychar = yylex();
524798Speter 			if (yyshifts >= 2 && yychar == YELSE) {
525798Speter 				recovered();
526*14752Sthien 				copy((char *) (&Y), (char *) (&OY), sizeof Y);
527798Speter 				yerror("Deleted ';' before keyword else");
528798Speter 				yychar = yylex();
529*14752Sthien 				p->tag = T_IFX;
530798Speter 			}
531798Speter 		  }
532798Speter 		;
533798Speter 
534798Speter /*
535798Speter  * CASE STATEMENT LIST
536798Speter  */
537798Speter 
538798Speter cstat_list:
539798Speter 	cstat
540*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
541798Speter 		|
542798Speter 	cstat_list ';' cstat
543*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
544798Speter 		|
545798Speter 	error
546798Speter 		= {
547*14752Sthien 			$$.tr_entry = TR_NIL;
548798Speter Kerror:
549798Speter 			yyPerror("Malformed statement in case", PSTAT);
550798Speter 		  }
551798Speter 		|
552798Speter 	cstat_list error
553798Speter 		= goto Kerror;
554798Speter 		;
555798Speter 
556798Speter cstat:
557798Speter 	const_list ':' stat
558*14752Sthien 		= $$.tr_entry = tree4(T_CSTAT, lineof($2.i_entry),
559*14752Sthien 				fixlist($1.tr_entry), $3.tr_entry);
560798Speter 		|
561798Speter 	YCASELAB stat
562*14752Sthien 		= $$.tr_entry = tree4(T_CSTAT, lineof($1.i_entry), TR_NIL,
563*14752Sthien 					$2.tr_entry);
564798Speter 		|
565798Speter 	/* lambda */
566*14752Sthien 		= $$.tr_entry = TR_NIL;
567798Speter 		;
568798Speter 
569798Speter /*
570798Speter  * STATEMENT
571798Speter  */
572798Speter 
573798Speter stat:
574798Speter 	/* lambda */
575*14752Sthien 		= $$.tr_entry = TR_NIL;
576798Speter 		|
577798Speter 	YINT ':' stat
578*14752Sthien 		= $$.tr_entry = tree4(T_LABEL, lineof($2.i_entry),
579*14752Sthien 				$1.tr_entry == TR_NIL ? TR_NIL :
580*14752Sthien 					    (struct tnode *) *hash($1.cptr, 1), $3.tr_entry);
581798Speter 		|
582798Speter 	proc_id
583*14752Sthien 		= $$.tr_entry = tree4(T_PCALL, lineof(yyline), $1.tr_entry,
584*14752Sthien 						TR_NIL);
585798Speter 		|
586798Speter 	proc_id '(' wexpr_list ')'
587*14752Sthien 		= $$.tr_entry = tree4(T_PCALL, lineof($2.i_entry), $1.tr_entry,
588*14752Sthien 					fixlist($3.tr_entry));
589798Speter 		|
590798Speter 	YID error
591798Speter 		= goto NSerror;
592798Speter 		|
593798Speter 	assign
594798Speter 		|
595798Speter 	YBEGIN stat_list YEND
596798Speter 		= {
597*14752Sthien 			$$.tr_entry = tree3(T_BLOCK, lineof($1.i_entry),
598*14752Sthien 						fixlist($2.tr_entry));
599*14752Sthien 			if ($3.i_entry < 0)
600*14752Sthien 				brerror($1.i_entry, "begin");
601798Speter 		  }
602798Speter 		|
603798Speter 	YCASE expr YOF cstat_list YEND
604798Speter 		= {
605*14752Sthien 			$$.tr_entry = tree4(T_CASE, lineof($1.i_entry),
606*14752Sthien 					$2.tr_entry, fixlist($4.tr_entry));
607*14752Sthien 			if ($5.i_entry < 0)
608*14752Sthien 				brerror($1.i_entry, "case");
609798Speter 		  }
610798Speter 		|
611798Speter 	YWITH var_list YDO stat
612*14752Sthien 		= $$.tr_entry = tree4(T_WITH, lineof($1.i_entry),
613*14752Sthien 				fixlist($2.tr_entry), $4.tr_entry);
614798Speter 		|
615798Speter 	YWHILE expr YDO stat
616*14752Sthien 		= $$.tr_entry = tree4(T_WHILE, lineof($1.i_entry), $2.tr_entry,
617*14752Sthien 					$4.tr_entry);
618798Speter 		|
619798Speter 	YREPEAT stat_list YUNTIL expr
620*14752Sthien 		= $$.tr_entry = tree4(T_REPEAT, lineof($3.i_entry),
621*14752Sthien 				fixlist($2.tr_entry), $4.tr_entry);
622798Speter 		|
623798Speter 	YFOR assign YTO expr YDO stat
624*14752Sthien 		= $$.tr_entry = tree5(T_FORU, lineof($1.i_entry), $2.tr_entry,
625*14752Sthien 				$4.tr_entry, $6.tr_entry);
626798Speter 		|
627798Speter 	YFOR assign YDOWNTO expr YDO stat
628*14752Sthien 		= $$.tr_entry = tree5(T_FORD, lineof($1.i_entry), $2.tr_entry,
629*14752Sthien 				$4.tr_entry, $6.tr_entry);
630798Speter 		|
631798Speter 	YGOTO YINT
632*14752Sthien 		= $$.tr_entry = tree3(T_GOTO, lineof($1.i_entry),
633*14752Sthien 				(struct tnode *) *hash($2.cptr, 1));
634798Speter 		|
635798Speter 	YIF expr YTHEN stat
636*14752Sthien 		= $$.tr_entry = tree5(T_IF, lineof($1.i_entry), $2.tr_entry,
637*14752Sthien 				$4.tr_entry, TR_NIL);
638798Speter 		|
639798Speter 	YIF expr YTHEN stat YELSE stat
640*14752Sthien 		= $$.tr_entry = tree5(T_IFEL, lineof($1.i_entry), $2.tr_entry,
641*14752Sthien 					$4.tr_entry, $6.tr_entry);
642798Speter 		|
643798Speter 	error
644798Speter 		= {
645798Speter NSerror:
646*14752Sthien 			$$.tr_entry = TR_NIL;
647798Speter 			yyPerror("Malformed statement", PSTAT);
648798Speter 		  }
649798Speter 		;
650798Speter assign:
651798Speter 	variable ':' '=' expr
652*14752Sthien 		= $$.tr_entry = tree4(T_ASGN, lineof($2.i_entry), $1.tr_entry,
653*14752Sthien 				    $4.tr_entry);
654798Speter 		;
655798Speter 
656798Speter /*
657798Speter  * EXPRESSION
658798Speter  */
659798Speter 
660798Speter expr:
661798Speter 	error
662798Speter 		= {
663798Speter NEerror:
664*14752Sthien 			$$.tr_entry = TR_NIL;
665798Speter 			yyPerror("Missing/malformed expression", PEXPR);
666798Speter 		  }
667798Speter 		|
668798Speter 	expr relop expr			%prec '<'
669*14752Sthien 		= $$.tr_entry = tree4($2.i_entry,
670*14752Sthien 			$1.tr_entry->expr_node.const_tag == SAWCON ?
671*14752Sthien 			$3.tr_entry->expr_node.const_tag :
672*14752Sthien 			$1.tr_entry->expr_node.const_tag,
673*14752Sthien 			$1.tr_entry, $3.tr_entry);
674798Speter 		|
675798Speter 	'+' expr			%prec UNARYSIGN
676*14752Sthien 		= $$.tr_entry = tree3(T_PLUS, $2.tr_entry->expr_node.const_tag,
677*14752Sthien 				$2.tr_entry);
678798Speter 		|
679798Speter 	'-' expr			%prec UNARYSIGN
680*14752Sthien 		= $$.tr_entry = tree3(T_MINUS, $2.tr_entry->expr_node.const_tag,
681*14752Sthien 				$2.tr_entry);
682798Speter 		|
683798Speter 	expr addop expr			%prec '+'
684*14752Sthien 		= $$.tr_entry = tree4($2.i_entry,
685*14752Sthien 			$1.tr_entry->expr_node.const_tag == SAWCON ?
686*14752Sthien 			$3.tr_entry->expr_node.const_tag :
687*14752Sthien 			$1.tr_entry->expr_node.const_tag, $1.tr_entry,
688*14752Sthien 			$3.tr_entry);
689798Speter 		|
690798Speter 	expr divop expr			%prec '*'
691*14752Sthien 		= $$.tr_entry = tree4($2.i_entry,
692*14752Sthien 			$1.tr_entry->expr_node.const_tag == SAWCON ?
693*14752Sthien 			$3.tr_entry->expr_node.const_tag :
694*14752Sthien 			$1.tr_entry->expr_node.const_tag, $1.tr_entry,
695*14752Sthien 			$3.tr_entry);
696798Speter 		|
697798Speter 	YNIL
698*14752Sthien 		= $$.tr_entry = tree2(T_NIL, NOCON);
699798Speter 		|
700798Speter 	YSTRING
701*14752Sthien 		= $$.tr_entry = tree3(T_STRNG, SAWCON, $1.tr_entry);
702798Speter 		|
703798Speter 	YINT
704*14752Sthien 		= $$.tr_entry = tree3(T_INT, NOCON, $1.tr_entry);
705798Speter 		|
706798Speter 	YBINT
707*14752Sthien 		= $$.tr_entry = tree3(T_BINT, NOCON, $1.tr_entry);
708798Speter 		|
709798Speter 	YNUMB
710*14752Sthien 		= $$.tr_entry = tree3(T_FINT, NOCON, $1.tr_entry);
711798Speter 		|
712798Speter 	variable
713798Speter 		|
714798Speter 	YID error
715798Speter 		= goto NEerror;
716798Speter 		|
717798Speter 	func_id '(' wexpr_list ')'
718*14752Sthien 		= $$.tr_entry = tree4(T_FCALL, NOCON, $1.tr_entry,
719*14752Sthien 			fixlist($3.tr_entry));
720798Speter 		|
721798Speter 	'(' expr ')'
722*14752Sthien 		= $$.tr_entry = $2.tr_entry;
723798Speter 		|
724798Speter 	negop expr			%prec YNOT
725*14752Sthien 		= $$.tr_entry = tree3(T_NOT, NOCON, $2.tr_entry);
726798Speter 		|
727798Speter 	'[' element_list ']'
728*14752Sthien 		= $$.tr_entry = tree3(T_CSET, SAWCON, fixlist($2.tr_entry));
729798Speter 		|
730798Speter 	'[' ']'
731*14752Sthien 		= $$.tr_entry = tree3(T_CSET, SAWCON, TR_NIL);
732798Speter 		;
733798Speter 
734798Speter element_list:
735798Speter 	element
736*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
737798Speter 		|
738798Speter 	element_list ',' element
739*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
740798Speter 		;
741798Speter element:
742798Speter 	expr
743798Speter 		|
744798Speter 	expr YDOTDOT expr
745*14752Sthien 		= $$.tr_entry = tree3(T_RANG, $1.i_entry, $3.tr_entry);
746798Speter 		;
747798Speter 
748798Speter /*
749798Speter  * QUALIFIED VARIABLES
750798Speter  */
751798Speter 
752798Speter variable:
753798Speter 	YID
754798Speter 		= {
755804Speter 			@@ return (identis(var, VAR));
756*14752Sthien 			$$.tr_entry = setupvar($1.cptr, TR_NIL);
757798Speter 		  }
758798Speter 		|
759798Speter 	qual_var
760*14752Sthien 		= $1.tr_entry->var_node.qual =
761*14752Sthien 					fixlist($1.tr_entry->var_node.qual);
762798Speter 		;
763798Speter qual_var:
764798Speter 	array_id '[' expr_list ']'
765*14752Sthien 		= $$.tr_entry = setupvar($1.cptr, tree2(T_ARY,
766*14752Sthien 				(int) fixlist($3.tr_entry)));
767798Speter 		|
768798Speter 	qual_var '[' expr_list ']'
769*14752Sthien 		= $1.tr_entry->var_node.qual =
770*14752Sthien 				addlist($1.tr_entry->var_node.qual,
771*14752Sthien 				tree2(T_ARY, (int) fixlist($3.tr_entry)));
772798Speter 		|
773798Speter 	record_id '.' field_id
774*14752Sthien 		= $$.tr_entry = setupvar($1.cptr, setupfield($3.tr_entry,
775*14752Sthien 							TR_NIL));
776798Speter 		|
777798Speter 	qual_var '.' field_id
778*14752Sthien 		= $1.tr_entry->var_node.qual =
779*14752Sthien 		    addlist($1.tr_entry->var_node.qual,
780*14752Sthien 		    setupfield($3.tr_entry, TR_NIL));
781798Speter 		|
782798Speter 	ptr_id '^'
783*14752Sthien 		= $$.tr_entry = setupvar($1.cptr, tree1(T_PTR));
784798Speter 		|
785798Speter 	qual_var '^'
786*14752Sthien 		= $1.tr_entry->var_node.qual =
787*14752Sthien 			addlist($1.tr_entry->var_node.qual, tree1(T_PTR));
788798Speter 		;
789798Speter 
790798Speter /*
791798Speter  * Expression with write widths
792798Speter  */
793798Speter wexpr:
794798Speter 	expr
795798Speter 		|
796798Speter 	expr ':' expr
797*14752Sthien 		= $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry, TR_NIL);
798798Speter 		|
799798Speter 	expr ':' expr ':' expr
800*14752Sthien 		= $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry,
801*14752Sthien 						$5.tr_entry);
802798Speter 		|
803798Speter 	expr octhex
804*14752Sthien 		= $$.tr_entry = tree4(T_WEXP, $1.i_entry, TR_NIL, $2.tr_entry);
805798Speter 		|
806798Speter 	expr ':' expr octhex
807*14752Sthien 		= $$.tr_entry = tree4(T_WEXP, $1.i_entry, $3.tr_entry,
808*14752Sthien 					$4.tr_entry);
809798Speter 		;
810798Speter octhex:
811798Speter 	YOCT
812*14752Sthien 		= $$.i_entry = OCT;
813798Speter 		|
814798Speter 	YHEX
815*14752Sthien 		= $$.i_entry = HEX;
816798Speter 		;
817798Speter 
818798Speter expr_list:
819798Speter 	expr
820*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
821798Speter 		|
822798Speter 	expr_list ',' expr
823*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
824798Speter 		;
825798Speter 
826798Speter wexpr_list:
827798Speter 	wexpr
828*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
829798Speter 		|
830798Speter 	wexpr_list ',' wexpr
831*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
832798Speter 		;
833798Speter 
834798Speter /*
835798Speter  * OPERATORS
836798Speter  */
837798Speter 
838798Speter relop:
839*14752Sthien 	'='	= $$.i_entry = T_EQ;
840798Speter 		|
841*14752Sthien 	'<'	= $$.i_entry = T_LT;
842798Speter 		|
843*14752Sthien 	'>'	= $$.i_entry = T_GT;
844798Speter 		|
845*14752Sthien 	'<' '>'	= $$.i_entry = T_NE;
846798Speter 		|
847*14752Sthien 	'<' '='	= $$.i_entry = T_LE;
848798Speter 		|
849*14752Sthien 	'>' '='	= $$.i_entry = T_GE;
850798Speter 		|
851*14752Sthien 	YIN	= $$.i_entry = T_IN;
852798Speter 		;
853798Speter addop:
854*14752Sthien 	'+'	= $$.i_entry = T_ADD;
855798Speter 		|
856*14752Sthien 	'-'	= $$.i_entry = T_SUB;
857798Speter 		|
858*14752Sthien 	YOR	= $$.i_entry = T_OR;
859798Speter 		|
860*14752Sthien 	'|'	= $$.i_entry = T_OR;
861798Speter 		;
862798Speter divop:
863*14752Sthien 	'*'	= $$.i_entry = T_MULT;
864798Speter 		|
865*14752Sthien 	'/'	= $$.i_entry = T_DIVD;
866798Speter 		|
867*14752Sthien 	YDIV	= $$.i_entry = T_DIV;
868798Speter 		|
869*14752Sthien 	YMOD	= $$.i_entry = T_MOD;
870798Speter 		|
871*14752Sthien 	YAND	= $$.i_entry = T_AND;
872798Speter 		|
873*14752Sthien 	'&'	= $$.i_entry = T_AND;
874798Speter 		;
875798Speter 
876798Speter negop:
877798Speter 	YNOT
878798Speter 		|
879798Speter 	'~'
880798Speter 		;
881798Speter 
882798Speter /*
883798Speter  * LISTS
884798Speter  */
885798Speter 
886798Speter var_list:
887798Speter 	variable
888*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
889798Speter 		|
890798Speter 	var_list ',' variable
891*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
892798Speter 		;
893798Speter 
894798Speter id_list:
895798Speter 	YID
896*14752Sthien 		= $$.tr_entry = newlist($1.tr_entry);
897798Speter 		|
898798Speter 	id_list ',' YID
899*14752Sthien 		= $$.tr_entry = addlist($1.tr_entry, $3.tr_entry);
900798Speter 		;
901798Speter 
902798Speter /*
903798Speter  * Identifier productions with semantic restrictions
904798Speter  *
905804Speter  * For these productions, the characters @@ signify
906798Speter  * that the associated C statement is to provide
907798Speter  * the semantic restriction for this reduction.
908798Speter  * These lines are made into a procedure yyEactr, similar to
909798Speter  * yyactr, which determines whether the corresponding reduction
910798Speter  * is permitted, or whether an error is to be signaled.
911798Speter  * A zero return from yyEactr is considered an error.
912798Speter  * YyEactr is called with an argument "var" giving the string
913798Speter  * name of the variable in question, essentially $1, although
914798Speter  * $1 will not work because yyEactr is called from loccor in
915798Speter  * the recovery routines.
916798Speter  */
917798Speter 
918798Speter const_id:
919798Speter 	YID
920804Speter 		= @@ return (identis(var, CONST));
921798Speter 		;
922798Speter type_id:
923798Speter 	YID
924798Speter 		= {
925804Speter 			@@ return (identis(var, TYPE));
926*14752Sthien 			$$.tr_entry = tree3(T_TYID, lineof(yyline), $1.tr_entry);
927798Speter 		  }
928798Speter 		;
929798Speter var_id:
930798Speter 	YID
931804Speter 		= @@ return (identis(var, VAR));
932798Speter 		;
933798Speter array_id:
934798Speter 	YID
935804Speter 		= @@ return (identis(var, ARRAY));
936798Speter 		;
937798Speter ptr_id:
938798Speter 	YID
939804Speter 		= @@ return (identis(var, PTRFILE));
940798Speter 		;
941798Speter record_id:
942798Speter 	YID
943804Speter 		= @@ return (identis(var, RECORD));
944798Speter 		;
945798Speter field_id:
946798Speter 	YID
947804Speter 		= @@ return (identis(var, FIELD));
948798Speter 		;
949798Speter proc_id:
950798Speter 	YID
951804Speter 		= @@ return (identis(var, PROC));
952798Speter 		;
953798Speter func_id:
954798Speter 	YID
955804Speter 		= @@ return (identis(var, FUNC));
956798Speter 		;
957