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