xref: /csrg-svn/old/dbx/commands.y (revision 9683)
1*9683Slinton %{
2*9683Slinton 
3*9683Slinton /* Copyright (c) 1982 Regents of the University of California */
4*9683Slinton 
5*9683Slinton static char sccsid[] = "@(#)@(#)commands.y 1.1 12/15/82";
6*9683Slinton 
7*9683Slinton /*
8*9683Slinton  * Yacc grammar for debugger commands.
9*9683Slinton  */
10*9683Slinton 
11*9683Slinton #include "defs.h"
12*9683Slinton #include "symbols.h"
13*9683Slinton #include "operators.h"
14*9683Slinton #include "tree.h"
15*9683Slinton #include "process.h"
16*9683Slinton #include "source.h"
17*9683Slinton #include "scanner.h"
18*9683Slinton #include "names.h"
19*9683Slinton 
20*9683Slinton private String curformat = "X";
21*9683Slinton 
22*9683Slinton %}
23*9683Slinton 
24*9683Slinton %term
25*9683Slinton     ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP
26*9683Slinton     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
27*9683Slinton     PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
28*9683Slinton     STOP STOPI TRACE TRACEI
29*9683Slinton     USE WHATIS WHEN WHERE WHEREIS WHICH
30*9683Slinton 
31*9683Slinton %term INT REAL NAME STRING
32*9683Slinton %term LFORMER RFORMER ABSTRACTION ARROW
33*9683Slinton 
34*9683Slinton %right INT
35*9683Slinton %binary REDIRECT
36*9683Slinton %binary '<' '=' '>' '!' IN
37*9683Slinton %left '+' '-' OR
38*9683Slinton %left UNARYSIGN
39*9683Slinton %left '*' '/' DIV MOD AND
40*9683Slinton %left NOT '(' '[' '.' '^' ARROW
41*9683Slinton 
42*9683Slinton %union {
43*9683Slinton     Name y_name;
44*9683Slinton     Symbol y_sym;
45*9683Slinton     Node y_node;
46*9683Slinton     Integer y_int;
47*9683Slinton     Operator y_op;
48*9683Slinton     long y_long;
49*9683Slinton     double y_real;
50*9683Slinton     String y_string;
51*9683Slinton     Boolean y_bool;
52*9683Slinton     Cmdlist y_cmdlist;
53*9683Slinton };
54*9683Slinton 
55*9683Slinton %type <y_op>	    trace stop
56*9683Slinton %type <y_long>	    INT count
57*9683Slinton %type <y_real>	    REAL
58*9683Slinton %type <y_string>    STRING redirectout filename opt_filename mode
59*9683Slinton %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP
60*9683Slinton %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
61*9683Slinton %type <y_name>	    NEXT NEXTI NIL NOT OR
62*9683Slinton %type <y_name>	    PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
63*9683Slinton %type <y_name>	    STOP STOPI TRACE TRACEI
64*9683Slinton %type <y_name>	    USE WHATIS WHEN WHERE WHEREIS WHICH
65*9683Slinton %type <y_name>	    name NAME keyword
66*9683Slinton %type <y_node>      symbol
67*9683Slinton %type <y_node>	    command rcommand cmd step what where examine
68*9683Slinton %type <y_node>	    event opt_arglist opt_cond
69*9683Slinton %type <y_node>	    exp_list exp term boolean_exp constant address
70*9683Slinton %type <y_node>	    alias_command list_command line_number
71*9683Slinton %type <y_cmdlist>   actions
72*9683Slinton 
73*9683Slinton %%
74*9683Slinton 
75*9683Slinton input:
76*9683Slinton     input command_nl
77*9683Slinton |
78*9683Slinton     /* empty */
79*9683Slinton ;
80*9683Slinton command_nl:
81*9683Slinton     command_line '\n'
82*9683Slinton |
83*9683Slinton     command_line ';'
84*9683Slinton |
85*9683Slinton     '\n'
86*9683Slinton ;
87*9683Slinton 
88*9683Slinton command_line:
89*9683Slinton     command
90*9683Slinton {
91*9683Slinton 	if ($1 != nil) {
92*9683Slinton 	    eval($1);
93*9683Slinton 	}
94*9683Slinton }
95*9683Slinton |
96*9683Slinton     rcommand redirectout
97*9683Slinton {
98*9683Slinton 	if ($1 != nil) {
99*9683Slinton 	    if ($2 != nil) {
100*9683Slinton 		setout($2);
101*9683Slinton 		eval($1);
102*9683Slinton 		unsetout();
103*9683Slinton 	    } else {
104*9683Slinton 		eval($1);
105*9683Slinton 	    }
106*9683Slinton 	}
107*9683Slinton }
108*9683Slinton ;
109*9683Slinton redirectout:
110*9683Slinton     '>' shellmode NAME
111*9683Slinton {
112*9683Slinton 	$$ = ident($3);
113*9683Slinton }
114*9683Slinton |
115*9683Slinton     /* empty */
116*9683Slinton {
117*9683Slinton 	$$ = nil;
118*9683Slinton }
119*9683Slinton ;
120*9683Slinton 
121*9683Slinton /*
122*9683Slinton  * Non-redirectable commands.
123*9683Slinton  */
124*9683Slinton command:
125*9683Slinton     alias_command
126*9683Slinton {
127*9683Slinton 	$$ = $1;
128*9683Slinton }
129*9683Slinton |
130*9683Slinton     ASSIGN term '=' exp
131*9683Slinton {
132*9683Slinton 	$$ = build(O_ASSIGN, $2, $4);
133*9683Slinton }
134*9683Slinton |
135*9683Slinton     CATCH INT
136*9683Slinton {
137*9683Slinton 	$$ = build(O_CATCH, $2);
138*9683Slinton }
139*9683Slinton |
140*9683Slinton     CONT
141*9683Slinton {
142*9683Slinton 	$$ = build(O_CONT);
143*9683Slinton }
144*9683Slinton |
145*9683Slinton     DELETE INT
146*9683Slinton {
147*9683Slinton 	$$ = build(O_DELETE, $2);
148*9683Slinton }
149*9683Slinton |
150*9683Slinton     EDIT shellmode opt_filename
151*9683Slinton {
152*9683Slinton 	$$ = build(O_EDIT, $3);
153*9683Slinton }
154*9683Slinton |
155*9683Slinton     FILE shellmode opt_filename
156*9683Slinton {
157*9683Slinton 	$$ = build(O_CHFILE, $3);
158*9683Slinton }
159*9683Slinton |
160*9683Slinton     FUNC
161*9683Slinton {
162*9683Slinton 	$$ = build(O_FUNC, nil);
163*9683Slinton }
164*9683Slinton |
165*9683Slinton     FUNC symbol
166*9683Slinton {
167*9683Slinton 	$$ = build(O_FUNC, $2);
168*9683Slinton }
169*9683Slinton |
170*9683Slinton     GRIPE
171*9683Slinton {
172*9683Slinton 	$$ = build(O_GRIPE);
173*9683Slinton }
174*9683Slinton |
175*9683Slinton     HELP
176*9683Slinton {
177*9683Slinton 	$$ = build(O_HELP);
178*9683Slinton }
179*9683Slinton |
180*9683Slinton     IGNORE INT
181*9683Slinton {
182*9683Slinton 	$$ = build(O_IGNORE, $2);
183*9683Slinton }
184*9683Slinton |
185*9683Slinton     list_command
186*9683Slinton {
187*9683Slinton 	$$ = $1;
188*9683Slinton }
189*9683Slinton |
190*9683Slinton     PSYM term
191*9683Slinton {
192*9683Slinton 	$$ = build(O_PSYM, $2);
193*9683Slinton }
194*9683Slinton |
195*9683Slinton     QUIT
196*9683Slinton {
197*9683Slinton 	if (not popinput()) {
198*9683Slinton 	    quit(0);
199*9683Slinton 	} else {
200*9683Slinton 	    $$ = nil;
201*9683Slinton 	}
202*9683Slinton }
203*9683Slinton |
204*9683Slinton     runcommand
205*9683Slinton {
206*9683Slinton 	run();
207*9683Slinton 	/* NOTREACHED */
208*9683Slinton }
209*9683Slinton |
210*9683Slinton     SH
211*9683Slinton {
212*9683Slinton 	shellline();
213*9683Slinton 	$$ = nil;
214*9683Slinton }
215*9683Slinton |
216*9683Slinton     SOURCE shellmode filename
217*9683Slinton {
218*9683Slinton 	$$ = build(O_SOURCE, $3);
219*9683Slinton }
220*9683Slinton |
221*9683Slinton     step
222*9683Slinton {
223*9683Slinton 	$$ = $1;
224*9683Slinton }
225*9683Slinton |
226*9683Slinton     stop where opt_cond
227*9683Slinton {
228*9683Slinton 	$$ = build($1, nil, $2, $3);
229*9683Slinton }
230*9683Slinton |
231*9683Slinton     stop what opt_cond
232*9683Slinton {
233*9683Slinton 	$$ = build($1, $2, nil, $3);
234*9683Slinton }
235*9683Slinton |
236*9683Slinton     stop IF boolean_exp
237*9683Slinton {
238*9683Slinton 	$$ = build($1, nil, nil, $3);
239*9683Slinton }
240*9683Slinton |
241*9683Slinton     trace what where opt_cond
242*9683Slinton {
243*9683Slinton 	$$ = build($1, $2, $3, $4);
244*9683Slinton }
245*9683Slinton |
246*9683Slinton     trace where opt_cond
247*9683Slinton {
248*9683Slinton 	$$ = build($1, nil, $2, $3);
249*9683Slinton }
250*9683Slinton |
251*9683Slinton     trace what opt_cond
252*9683Slinton {
253*9683Slinton 	$$ = build($1, $2, nil, $3);
254*9683Slinton }
255*9683Slinton |
256*9683Slinton     trace opt_cond
257*9683Slinton {
258*9683Slinton 	$$ = build($1, nil, nil, $2);
259*9683Slinton }
260*9683Slinton |
261*9683Slinton     WHATIS term
262*9683Slinton {
263*9683Slinton 	$$ = build(O_WHATIS, $2);
264*9683Slinton }
265*9683Slinton |
266*9683Slinton     WHEN event '{' actions '}'
267*9683Slinton {
268*9683Slinton 	$$ = build(O_ADDEVENT, $2, $4);
269*9683Slinton }
270*9683Slinton |
271*9683Slinton     WHEREIS symbol
272*9683Slinton {
273*9683Slinton 	$$ = build(O_WHEREIS, $2);
274*9683Slinton }
275*9683Slinton |
276*9683Slinton     WHICH symbol
277*9683Slinton {
278*9683Slinton 	$$ = build(O_WHICH, $2);
279*9683Slinton }
280*9683Slinton |
281*9683Slinton     USE shellmode sourcepath
282*9683Slinton {
283*9683Slinton 	$$ = nil;
284*9683Slinton 	if (list_size(sourcepath) == 0) {
285*9683Slinton 	    list_append(list_item("."), nil, sourcepath);
286*9683Slinton 	}
287*9683Slinton }
288*9683Slinton ;
289*9683Slinton runcommand:
290*9683Slinton     run shellmode arglist
291*9683Slinton ;
292*9683Slinton run:
293*9683Slinton     RUN
294*9683Slinton {
295*9683Slinton 	fflush(stdout);
296*9683Slinton 	arginit();
297*9683Slinton }
298*9683Slinton ;
299*9683Slinton arglist:
300*9683Slinton     arglist arg
301*9683Slinton |
302*9683Slinton     /* empty */
303*9683Slinton ;
304*9683Slinton arg:
305*9683Slinton     NAME
306*9683Slinton {
307*9683Slinton 	newarg(ident($1));
308*9683Slinton }
309*9683Slinton |
310*9683Slinton     '<' NAME
311*9683Slinton {
312*9683Slinton 	inarg(ident($2));
313*9683Slinton }
314*9683Slinton |
315*9683Slinton     '>' NAME
316*9683Slinton {
317*9683Slinton 	outarg(ident($2));
318*9683Slinton }
319*9683Slinton ;
320*9683Slinton step:
321*9683Slinton     STEP
322*9683Slinton {
323*9683Slinton 	$$ = build(O_STEP, true, false);
324*9683Slinton }
325*9683Slinton |
326*9683Slinton     STEPI
327*9683Slinton {
328*9683Slinton 	$$ = build(O_STEP, false, false);
329*9683Slinton }
330*9683Slinton |
331*9683Slinton     NEXT
332*9683Slinton {
333*9683Slinton 	$$ = build(O_STEP, true, true);
334*9683Slinton }
335*9683Slinton |
336*9683Slinton     NEXTI
337*9683Slinton {
338*9683Slinton 	$$ = build(O_STEP, false, true);
339*9683Slinton }
340*9683Slinton ;
341*9683Slinton shellmode:
342*9683Slinton     /* empty */
343*9683Slinton {
344*9683Slinton 	beginshellmode();
345*9683Slinton }
346*9683Slinton ;
347*9683Slinton sourcepath:
348*9683Slinton     sourcepath NAME
349*9683Slinton {
350*9683Slinton 	list_append(list_item(ident($2)), nil, sourcepath);
351*9683Slinton }
352*9683Slinton |
353*9683Slinton     /* empty */
354*9683Slinton {
355*9683Slinton 	String dir;
356*9683Slinton 
357*9683Slinton 	foreach (String, dir, sourcepath)
358*9683Slinton 	    list_delete(list_curitem(sourcepath), sourcepath);
359*9683Slinton 	endfor
360*9683Slinton }
361*9683Slinton ;
362*9683Slinton event:
363*9683Slinton     where
364*9683Slinton |
365*9683Slinton     exp
366*9683Slinton ;
367*9683Slinton actions:
368*9683Slinton     actions cmd ';'
369*9683Slinton {
370*9683Slinton 	$$ = $1;
371*9683Slinton 	cmdlist_append($2, $$);
372*9683Slinton }
373*9683Slinton |
374*9683Slinton     cmd ';'
375*9683Slinton {
376*9683Slinton 	$$ = list_alloc();
377*9683Slinton 	cmdlist_append($1, $$);
378*9683Slinton }
379*9683Slinton ;
380*9683Slinton cmd:
381*9683Slinton     command
382*9683Slinton |
383*9683Slinton     rcommand
384*9683Slinton ;
385*9683Slinton 
386*9683Slinton /*
387*9683Slinton  * Redirectable commands.
388*9683Slinton  */
389*9683Slinton rcommand:
390*9683Slinton     PRINT exp_list
391*9683Slinton {
392*9683Slinton 	$$ = build(O_PRINT, $2);
393*9683Slinton }
394*9683Slinton |
395*9683Slinton     WHERE
396*9683Slinton {
397*9683Slinton 	$$ = build(O_WHERE);
398*9683Slinton }
399*9683Slinton |
400*9683Slinton     examine
401*9683Slinton {
402*9683Slinton 	$$ = $1;
403*9683Slinton }
404*9683Slinton |
405*9683Slinton     CALL term
406*9683Slinton {
407*9683Slinton 	$$ = $2;
408*9683Slinton }
409*9683Slinton |
410*9683Slinton     DUMP
411*9683Slinton {
412*9683Slinton 	$$ = build(O_DUMP);
413*9683Slinton }
414*9683Slinton |
415*9683Slinton     STATUS
416*9683Slinton {
417*9683Slinton 	$$ = build(O_STATUS);
418*9683Slinton }
419*9683Slinton ;
420*9683Slinton alias_command:
421*9683Slinton     ALIAS name name
422*9683Slinton {
423*9683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
424*9683Slinton }
425*9683Slinton |
426*9683Slinton     ALIAS name
427*9683Slinton {
428*9683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
429*9683Slinton }
430*9683Slinton |
431*9683Slinton     ALIAS
432*9683Slinton {
433*9683Slinton 	$$ = build(O_ALIAS, nil, nil);
434*9683Slinton }
435*9683Slinton ;
436*9683Slinton trace:
437*9683Slinton     TRACE
438*9683Slinton {
439*9683Slinton 	$$ = O_TRACE;
440*9683Slinton }
441*9683Slinton |
442*9683Slinton     TRACEI
443*9683Slinton {
444*9683Slinton 	$$ = O_TRACEI;
445*9683Slinton }
446*9683Slinton ;
447*9683Slinton stop:
448*9683Slinton     STOP
449*9683Slinton {
450*9683Slinton 	$$ = O_STOP;
451*9683Slinton }
452*9683Slinton |
453*9683Slinton     STOPI
454*9683Slinton {
455*9683Slinton 	$$ = O_STOPI;
456*9683Slinton }
457*9683Slinton ;
458*9683Slinton what:
459*9683Slinton     exp
460*9683Slinton {
461*9683Slinton 	$$ = $1;
462*9683Slinton }
463*9683Slinton |
464*9683Slinton     STRING ':' line_number
465*9683Slinton {
466*9683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
467*9683Slinton }
468*9683Slinton ;
469*9683Slinton where:
470*9683Slinton     IN term
471*9683Slinton {
472*9683Slinton 	$$ = $2;
473*9683Slinton }
474*9683Slinton |
475*9683Slinton     AT line_number
476*9683Slinton {
477*9683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
478*9683Slinton }
479*9683Slinton |
480*9683Slinton     AT STRING ':' line_number
481*9683Slinton {
482*9683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
483*9683Slinton }
484*9683Slinton ;
485*9683Slinton filename:
486*9683Slinton     NAME
487*9683Slinton {
488*9683Slinton 	$$ = ident($1);
489*9683Slinton }
490*9683Slinton ;
491*9683Slinton opt_filename:
492*9683Slinton     /* empty */
493*9683Slinton {
494*9683Slinton 	$$ = nil;
495*9683Slinton }
496*9683Slinton |
497*9683Slinton     filename
498*9683Slinton {
499*9683Slinton 	$$ = $1;
500*9683Slinton }
501*9683Slinton ;
502*9683Slinton opt_arglist:
503*9683Slinton     /* empty */
504*9683Slinton {
505*9683Slinton 	$$ = nil;
506*9683Slinton }
507*9683Slinton |
508*9683Slinton     '(' exp_list ')'
509*9683Slinton {
510*9683Slinton 	$$ = $2;
511*9683Slinton }
512*9683Slinton ;
513*9683Slinton list_command:
514*9683Slinton     LIST
515*9683Slinton {
516*9683Slinton 	$$ = build(O_LIST,
517*9683Slinton 	    build(O_LCON, (long) cursrcline),
518*9683Slinton 	    build(O_LCON, (long) cursrcline + 9)
519*9683Slinton 	);
520*9683Slinton }
521*9683Slinton |
522*9683Slinton     LIST line_number
523*9683Slinton {
524*9683Slinton 	$$ = build(O_LIST, $2, $2);
525*9683Slinton }
526*9683Slinton |
527*9683Slinton     LIST line_number ',' line_number
528*9683Slinton {
529*9683Slinton 	$$ = build(O_LIST, $2, $4);
530*9683Slinton }
531*9683Slinton |
532*9683Slinton     LIST symbol
533*9683Slinton {
534*9683Slinton 	$$ = build(O_LIST, $2);
535*9683Slinton }
536*9683Slinton ;
537*9683Slinton line_number:
538*9683Slinton     INT
539*9683Slinton {
540*9683Slinton 	$$ = build(O_LCON, $1);
541*9683Slinton }
542*9683Slinton |
543*9683Slinton     '$'
544*9683Slinton {
545*9683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
546*9683Slinton }
547*9683Slinton ;
548*9683Slinton examine:
549*9683Slinton     address '/' count mode
550*9683Slinton {
551*9683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
552*9683Slinton }
553*9683Slinton |
554*9683Slinton     address ',' address '/' mode
555*9683Slinton {
556*9683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
557*9683Slinton }
558*9683Slinton |
559*9683Slinton     '/' count mode
560*9683Slinton {
561*9683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
562*9683Slinton }
563*9683Slinton ;
564*9683Slinton address:
565*9683Slinton     INT
566*9683Slinton {
567*9683Slinton 	$$ = build(O_LCON, $1);
568*9683Slinton }
569*9683Slinton |
570*9683Slinton     '&' term
571*9683Slinton {
572*9683Slinton 	$$ = amper($2);
573*9683Slinton }
574*9683Slinton |
575*9683Slinton     address '+' address
576*9683Slinton {
577*9683Slinton 	$$ = build(O_ADD, $1, $3);
578*9683Slinton }
579*9683Slinton |
580*9683Slinton     address '-' address
581*9683Slinton {
582*9683Slinton 	$$ = build(O_SUB, $1, $3);
583*9683Slinton }
584*9683Slinton |
585*9683Slinton     address '*' address
586*9683Slinton {
587*9683Slinton 	$$ = build(O_MUL, $1, $3);
588*9683Slinton }
589*9683Slinton |
590*9683Slinton     '*' address %prec UNARYSIGN
591*9683Slinton {
592*9683Slinton 	$$ = build(O_INDIR, $2);
593*9683Slinton }
594*9683Slinton |
595*9683Slinton     '(' exp ')'
596*9683Slinton {
597*9683Slinton 	$$ = $2;
598*9683Slinton }
599*9683Slinton ;
600*9683Slinton count:
601*9683Slinton     /* empty */
602*9683Slinton {
603*9683Slinton 	$$ = 1;
604*9683Slinton }
605*9683Slinton |
606*9683Slinton     INT
607*9683Slinton {
608*9683Slinton 	$$ = $1;
609*9683Slinton }
610*9683Slinton ;
611*9683Slinton mode:
612*9683Slinton     name
613*9683Slinton {
614*9683Slinton 	$$ = ident($1);
615*9683Slinton 	curformat = $$;
616*9683Slinton }
617*9683Slinton |
618*9683Slinton     /* empty */
619*9683Slinton {
620*9683Slinton 	$$ = curformat;
621*9683Slinton }
622*9683Slinton ;
623*9683Slinton opt_cond:
624*9683Slinton     /* empty */
625*9683Slinton {
626*9683Slinton 	$$ = nil;
627*9683Slinton }
628*9683Slinton |
629*9683Slinton     IF boolean_exp
630*9683Slinton {
631*9683Slinton 	$$ = $2;
632*9683Slinton }
633*9683Slinton ;
634*9683Slinton exp_list:
635*9683Slinton     exp
636*9683Slinton {
637*9683Slinton 	$$ = build(O_COMMA, $1, nil);
638*9683Slinton }
639*9683Slinton |
640*9683Slinton     exp ',' exp_list
641*9683Slinton {
642*9683Slinton 	$$ = build(O_COMMA, $1, $3);
643*9683Slinton }
644*9683Slinton ;
645*9683Slinton exp:
646*9683Slinton     term
647*9683Slinton {
648*9683Slinton 	$$ = build(O_RVAL, $1);
649*9683Slinton }
650*9683Slinton |
651*9683Slinton     constant
652*9683Slinton {
653*9683Slinton 	$$ = $1;
654*9683Slinton }
655*9683Slinton |
656*9683Slinton     '+' exp %prec UNARYSIGN
657*9683Slinton {
658*9683Slinton 	$$ = $2;
659*9683Slinton }
660*9683Slinton |
661*9683Slinton     '-' exp %prec UNARYSIGN
662*9683Slinton {
663*9683Slinton 	$$ = build(O_NEG, $2);
664*9683Slinton }
665*9683Slinton |
666*9683Slinton     '&' exp %prec UNARYSIGN
667*9683Slinton {
668*9683Slinton 	$$ = amper($2);
669*9683Slinton }
670*9683Slinton |
671*9683Slinton     exp '+' exp
672*9683Slinton {
673*9683Slinton 	$$ = build(O_ADD, $1, $3);
674*9683Slinton }
675*9683Slinton |
676*9683Slinton     exp '-' exp
677*9683Slinton {
678*9683Slinton 	$$ = build(O_SUB, $1, $3);
679*9683Slinton }
680*9683Slinton |
681*9683Slinton     exp '*' exp
682*9683Slinton {
683*9683Slinton 	$$ = build(O_MUL, $1, $3);
684*9683Slinton }
685*9683Slinton |
686*9683Slinton     exp '/' exp
687*9683Slinton {
688*9683Slinton 	$$ = build(O_DIVF, $1, $3);
689*9683Slinton }
690*9683Slinton |
691*9683Slinton     exp DIV exp
692*9683Slinton {
693*9683Slinton 	$$ = build(O_DIV, $1, $3);
694*9683Slinton }
695*9683Slinton |
696*9683Slinton     exp MOD exp
697*9683Slinton {
698*9683Slinton 	$$ = build(O_MOD, $1, $3);
699*9683Slinton }
700*9683Slinton |
701*9683Slinton     exp AND exp
702*9683Slinton {
703*9683Slinton 	$$ = build(O_AND, $1, $3);
704*9683Slinton }
705*9683Slinton |
706*9683Slinton     exp OR exp
707*9683Slinton {
708*9683Slinton 	$$ = build(O_OR, $1, $3);
709*9683Slinton }
710*9683Slinton |
711*9683Slinton     exp '<' exp
712*9683Slinton {
713*9683Slinton 	$$ = build(O_LT, $1, $3);
714*9683Slinton }
715*9683Slinton |
716*9683Slinton     exp '<' '=' exp
717*9683Slinton {
718*9683Slinton 	$$ = build(O_LE, $1, $4);
719*9683Slinton }
720*9683Slinton |
721*9683Slinton     exp '>' exp
722*9683Slinton {
723*9683Slinton 	$$ = build(O_GT, $1, $3);
724*9683Slinton }
725*9683Slinton |
726*9683Slinton     exp '>' '=' exp
727*9683Slinton {
728*9683Slinton 	$$ = build(O_GE, $1, $4);
729*9683Slinton }
730*9683Slinton |
731*9683Slinton     exp '=' exp
732*9683Slinton {
733*9683Slinton 	$$ = build(O_EQ, $1, $3);
734*9683Slinton }
735*9683Slinton |
736*9683Slinton     exp '=' '=' exp
737*9683Slinton {
738*9683Slinton 	$$ = build(O_EQ, $1, $4);
739*9683Slinton }
740*9683Slinton |
741*9683Slinton     exp '<' '>' exp
742*9683Slinton {
743*9683Slinton 	$$ = build(O_NE, $1, $4);
744*9683Slinton }
745*9683Slinton |
746*9683Slinton     exp '!' '=' exp
747*9683Slinton {
748*9683Slinton 	$$ = build(O_NE, $1, $4);
749*9683Slinton }
750*9683Slinton |
751*9683Slinton     '(' exp ')'
752*9683Slinton {
753*9683Slinton 	$$ = $2;
754*9683Slinton }
755*9683Slinton ;
756*9683Slinton term:
757*9683Slinton     symbol
758*9683Slinton {
759*9683Slinton 	$$ = $1;
760*9683Slinton }
761*9683Slinton |
762*9683Slinton     term '[' exp_list ']'
763*9683Slinton {
764*9683Slinton 	$$ = subscript($1, $3);
765*9683Slinton }
766*9683Slinton |
767*9683Slinton     term '.' name
768*9683Slinton {
769*9683Slinton 	$$ = dot($1, $3);
770*9683Slinton }
771*9683Slinton |
772*9683Slinton     term ARROW name
773*9683Slinton {
774*9683Slinton 	$$ = dot($1, $3);
775*9683Slinton }
776*9683Slinton |
777*9683Slinton     '*' term %prec UNARYSIGN
778*9683Slinton {
779*9683Slinton 	$$ = build(O_INDIR, $2);
780*9683Slinton }
781*9683Slinton |
782*9683Slinton     '*' '(' exp ')' %prec UNARYSIGN
783*9683Slinton {
784*9683Slinton 	$$ = build(O_INDIR, $3);
785*9683Slinton }
786*9683Slinton |
787*9683Slinton     term '^' %prec UNARYSIGN
788*9683Slinton {
789*9683Slinton 	$$ = build(O_INDIR, $1);
790*9683Slinton }
791*9683Slinton |
792*9683Slinton     '#' term %prec UNARYSIGN
793*9683Slinton {
794*9683Slinton 	$$ = concrete($2);
795*9683Slinton }
796*9683Slinton |
797*9683Slinton     term '(' exp_list ')'
798*9683Slinton {
799*9683Slinton 	$$ = build(O_CALL, $1, $3);
800*9683Slinton }
801*9683Slinton ;
802*9683Slinton boolean_exp:
803*9683Slinton     exp
804*9683Slinton {
805*9683Slinton 	chkboolean($1);
806*9683Slinton 	$$ = $1;
807*9683Slinton }
808*9683Slinton ;
809*9683Slinton constant:
810*9683Slinton     INT
811*9683Slinton {
812*9683Slinton 	$$ = build(O_LCON, $1);
813*9683Slinton }
814*9683Slinton |
815*9683Slinton     REAL
816*9683Slinton {
817*9683Slinton 	$$ = build(O_FCON, $1);
818*9683Slinton }
819*9683Slinton |
820*9683Slinton     STRING
821*9683Slinton {
822*9683Slinton 	$$ = build(O_SCON, $1);
823*9683Slinton }
824*9683Slinton ;
825*9683Slinton symbol:
826*9683Slinton     name
827*9683Slinton {
828*9683Slinton 	$$ = build(O_SYM, which($1));
829*9683Slinton }
830*9683Slinton ;
831*9683Slinton name:
832*9683Slinton     NAME
833*9683Slinton {
834*9683Slinton 	$$ = $1;
835*9683Slinton }
836*9683Slinton |
837*9683Slinton     keyword
838*9683Slinton {
839*9683Slinton 	$$ = $1;
840*9683Slinton }
841*9683Slinton keyword:
842*9683Slinton     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DELETE | DIV | DUMP |
843*9683Slinton     EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
844*9683Slinton     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
845*9683Slinton     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
846*9683Slinton     STOP | STOPI | TRACE | TRACEI |
847*9683Slinton     USE | WHATIS | WHEN | WHERE | WHICH
848*9683Slinton ;
849