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