BSD 4_1c_2 release
[unix-history] / usr / src / ucb / pascal / pdx / command / grammar.yacc
CommitLineData
85d1f78f
ML
1%{
2/* Copyright (c) 1982 Regents of the University of California */
3
e804469b 4static char sccsid[] = "@(#)grammar.yacc 1.2 1/20/82";
85d1f78f
ML
5
6/*
7 * yacc grammar for debugger commands
8 */
9
10#include "defs.h"
11#include "command.h"
12#include "sym.h"
13#include "symtab.h"
14#include "tree.h"
15#include "process.h"
16#include "source.h"
17
18%}
19
20%term ALIAS ASSIGN CALL CHFILE
21%term CONT DUMP EDIT
22%term GRIPE HELP LIST NEXT
23%term QUIT REMAKE PRINT
24%term RUN SH SOURCE
25%term STATUS STEP
26%term STOP STOPI TRACE TRACEI
27%term DELETE
28%term WHATIS WHICH WHERE
29%term XI XD
30
31%term AT IN IF
32%term FILENAME
33%term INT REAL NAME STRING
34%term DIV MOD
35%term AND OR NOT
36
37%binary '<' '=' '>' IN
38%left '+' '-' OR '|'
39%left UNARYSIGN
40%left '*' '/' DIV MOD AND '&'
41%left NOT
42
43%union {
44 SYM *y_sym;
45 NODE *y_node;
46 int y_int;
47 OP y_op;
48 long y_long;
49 double y_real;
50 char *y_string;
51 BOOLEAN y_bool;
52};
53
54%type <y_int> trace TRACE TRACEI stop STOP STOPI
55%type <y_long> INT
56%type <y_real> REAL
57%type <y_op> addop mulop relop
58%type <y_string> STRING FILENAME SH opt_filename
59%type <y_sym> NAME
60%type <y_node> command rcommand what where opt_arglist opt_cond
61%type <y_node> exp_list exp boolean_exp term constant
62%type <y_node> line_list line_number address_list
63%%
64input:
65 input command_nl
66{
67 prompt();
68}
69| /* empty */
70;
71command_nl:
72 command_line '\n'
73| '\n'
74;
75
76/*
77 * There are two kinds of commands, those that can be redirected
78 * and those that can't.
79 */
80
81command_line:
82 command
83{
84 eval($1);
85}
86| rcommand
87{
88 eval($1);
89}
90| rcommand '>' FILENAME
91{
92 setout($3);
93 eval($1);
94 unsetout();
95}
96| SH
97{
98 shell($1);
99}
100| run args
101{
102 run();
103}
104;
105run:
106 RUN
107{
108 arginit();
109}
110;
111args:
112 arg args
113| /* empty */
114;
115arg:
116 FILENAME
117{
118 newarg($1);
119}
120| '<' FILENAME
121{
122 inarg($2);
123}
124| '>' FILENAME
125{
126 outarg($2);
127}
128;
129command:
130 ASSIGN term exp
131{
132 $$ = build(O_ASSIGN, $2, $3);
133}
134| CHFILE opt_filename
135{
136 $$ = build(O_CHFILE, $2);
137}
138| CONT
139{
140 $$ = build(O_CONT);
141}
142| LIST line_list
143{
144 $$ = build(O_LIST, $2);
145}
146| LIST NAME
147{
148 $$ = build(O_LIST, build(O_NAME, $2));
149}
150| NEXT
151{
152 $$ = build(O_NEXT);
153}
154| PRINT exp_list
155{
156 $$ = build(O_PRINT, $2);
157}
158| QUIT
159{
5869a611 160 quit(0);
85d1f78f
ML
161}
162| STEP
163{
164 $$ = build(O_STEP);
165}
166| stop where opt_cond
167{
168 $$ = build($1, NIL, $2, $3);
169}
170| stop what opt_cond
171{
172 $$ = build($1, $2, NIL, $3);
173}
174| stop IF boolean_exp
175{
176 $$ = build($1, NIL, NIL, $3);
177}
178| trace what where opt_cond
179{
180 $$ = build($1, $2, $3, $4);
181}
182| trace where opt_cond
183{
184 $$ = build($1, NIL, $2, $3);
185}
186| trace what opt_cond
187{
188 $$ = build($1, $2, NIL, $3);
189}
190| trace opt_cond
191{
192 $$ = build($1, NIL, NIL, $2);
193}
194| DELETE INT
195{
196 $$ = build(O_DELETE, $2);
197}
198| WHATIS term
199{
200 $$ = build(O_WHATIS, $2);
201}
202| WHICH NAME
203{
204 $$ = build(O_WHICH, $2);
205}
206| WHERE
207{
208 $$ = build(O_WHERE);
209}
210| XI address_list
211{
212 $$ = build(O_XI, $2);
213}
214| XD address_list
215{
216 $$ = build(O_XD, $2);
217}
218;
219rcommand:
220 ALIAS FILENAME opt_filename
221{
222 $$ = build(O_ALIAS, $2, $3);
223}
224| ALIAS
225{
226 $$ = build(O_ALIAS, NIL, NIL);
227}
228| CALL term opt_arglist
229{
230 $$ = build(O_CALL, $2, $3);
231}
232| EDIT opt_filename
233{
234 $$ = build(O_EDIT, $2);
235}
236| DUMP
237{
238 $$ = build(O_DUMP);
239}
240| GRIPE
241{
242 $$ = build(O_GRIPE);
243}
244| HELP
245{
246 $$ = build(O_HELP);
247}
248| REMAKE
249{
250 $$ = build(O_REMAKE);
251}
252| SOURCE FILENAME
253{
254 $$ = build(O_SOURCE, $2);
255}
256| STATUS
257{
258 $$ = build(O_STATUS);
259}
260;
261trace:
262 TRACE
263{
264 $$ = O_TRACE;
265}
266| TRACEI
267{
268 $$ = O_TRACEI;
269}
270;
271stop:
272 STOP
273{
274 $$ = O_STOP;
275}
276| STOPI
277{
278 $$ = O_STOPI;
279}
280;
281what:
282 exp
283| FILENAME line_number
284{
285 $$ = build(O_QLINE, $1, $2);
286}
287;
288where:
289 IN term
290{
291 $$ = $2;
292}
293| AT line_number
294{
295 $$ = build(O_QLINE, cursource, $2);
296}
297| AT FILENAME line_number
298{
299 $$ = build(O_QLINE, $2, $3);
300}
301;
302opt_filename:
303 /* empty */
304{
305 $$ = NIL;
306}
307| FILENAME
308;
309opt_arglist:
310 /* empty */
311{
312 $$ = NIL;
313}
314| '(' exp_list ')'
315{
316 $$ = $2;
317}
318;
319line_list:
320 /* empty */
321{
322 NODE *first, *last;
323
324 first = build(O_LCON, (long) 1);
325 last = build(O_LCON, (long) lastlinenum);
326 $$ = build(O_COMMA, first, last);
327}
328| line_number
329{
330 $$ = build(O_COMMA, $1, $1);
331}
332| line_number ',' line_number
333{
334 $$ = build(O_COMMA, $1, $3);
335}
336;
337line_number:
338 INT
339{
340 $$ = build(O_LCON, $1);
341}
342| '$'
343{
344 $$ = build(O_LCON, (long) lastlinenum);
345}
346;
347address_list:
348 exp
349{
350 $$ = build(O_COMMA, $1, $1);
351}
352| exp ',' exp
353{
354 $$ = build(O_COMMA, $1, $3);
355}
356;
357opt_cond:
358 /* empty */
359{
360 $$ = NIL;
361}
362| IF boolean_exp
363{
364 $$ = $2;
365}
366;
367exp_list:
368 exp
369{
370 $$ = build(O_COMMA, $1, NIL);
371}
372| exp ',' exp_list
373{
374 $$ = build(O_COMMA, $1, $3);
375}
376;
377exp:
378 term
379{
380 $$ = build(O_RVAL, $1);
381}
382| term '(' exp_list ')'
383{
384 $$ = build(O_CALL, $1, $3);
385}
386| constant
387| '+' exp %prec UNARYSIGN
388{
389 $$ = $2;
390}
391| '-' exp %prec UNARYSIGN
392{
393 $$ = build(O_NEG, $2);
394}
395| exp addop exp %prec '+'
396{
397 $$ = build($2, $1, $3);
398}
399| exp mulop exp %prec '*'
400{
401 $$ = build($2, $1, $3);
402}
403| exp relop exp %prec '<'
404{
405 $$ = build($2, $1, $3);
406}
407| '(' exp ')'
408{
409 $$ = $2;
410}
411;
412boolean_exp:
413 exp
414{
415 chkboolean($$ = $1);
416}
417;
418term:
419 NAME
420{
421 $$ = build(O_NAME, $1);
422}
423| AT
424{
425 SYM *s;
426
427 s = st_lookup(symtab, "at");
428 if (s == NIL) {
429 error("\"at\" is not defined");
430 }
431 $$ = build(O_NAME, s);
432}
433| term '[' exp_list ']'
434{
435 $$ = subscript($1, $3);
436}
437| term '.' NAME
438{
439 $$ = dot($1, $3);
440}
441| term '^'
442{
443 $$ = build(O_INDIR, $1);
444}
445;
446constant:
447 INT
448{
449 $$ = build(O_LCON, $1);
450}
451| REAL
452{
453 $$ = build(O_FCON, $1);
454}
455| STRING
456{
457 $$ = build(O_SCON, $1);
458}
459;
460addop:
461 '+'
462{
463 $$ = O_ADD;
464}
465| '-'
466{
467 $$ = O_SUB;
468}
469| OR
470{
471 $$ = O_OR;
472}
473| '|'
474{
475 $$ = O_OR;
476}
477;
478mulop:
479 '*'
480{
481 $$ = O_MUL;
482}
483| '/'
484{
485 $$ = O_DIVF;
486}
487| DIV
488{
489 $$ = O_DIV;
490}
491| MOD
492{
493 $$ = O_MOD;
494}
495| AND
496{
497 $$ = O_AND;
498}
499| '&'
500{
501 $$ = O_AND;
502}
503;
504relop:
505 '<'
506{
507 $$ = O_LT;
508}
509| '<' '='
510{
511 $$ = O_LE;
512}
513| '>'
514{
515 $$ = O_GT;
516}
517| '>' '='
518{
519 $$ = O_GE;
520}
521| '='
522{
523 $$ = O_EQ;
524}
525| '<' '>'
526{
527 $$ = O_NE;
528}
529;
530%%
531
532/*
533 * parser error handling
534 */
535
536yyerror(s)
537char *s;
538{
539 if (strcmp(s, "syntax error") == 0) {
540 error("bad command syntax");
541 } else {
542 error(s);
543 }
544}
545
546/*
547 * In recovering from an error we gobble input up to a newline.
548 */
549
550gobble()
551{
552 register int t;
553
554 if (!nlflag) {
555 while ((t = yylex()) != '\n' && t != 0);
556 }
557}