xref: /csrg-svn/old/dbx/commands.y (revision 38105)
121633Sdist %{
221633Sdist 
321631Sdist /*
4*38105Sbostic  * Copyright (c) 1983 The Regents of the University of California.
5*38105Sbostic  * All rights reserved.
621631Sdist  *
7*38105Sbostic  * Redistribution and use in source and binary forms are permitted
8*38105Sbostic  * provided that the above copyright notice and this paragraph are
9*38105Sbostic  * duplicated in all such forms and that any documentation,
10*38105Sbostic  * advertising materials, and other materials related to such
11*38105Sbostic  * distribution and use acknowledge that the software was developed
12*38105Sbostic  * by the University of California, Berkeley.  The name of the
13*38105Sbostic  * University may not be used to endorse or promote products derived
14*38105Sbostic  * from this software without specific prior written permission.
15*38105Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16*38105Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17*38105Sbostic  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1821631Sdist  */
1921631Sdist 
20*38105Sbostic #ifndef lint
21*38105Sbostic static char sccsid[] = "@(#)commands.y	5.5 (Berkeley) 05/23/89";
22*38105Sbostic #endif /* not lint */
2318214Slinton 
249683Slinton /*
259683Slinton  * Yacc grammar for debugger commands.
269683Slinton  */
279683Slinton 
289683Slinton #include "defs.h"
299683Slinton #include "symbols.h"
309683Slinton #include "operators.h"
319683Slinton #include "tree.h"
329683Slinton #include "process.h"
339683Slinton #include "source.h"
349683Slinton #include "scanner.h"
3518214Slinton #include "keywords.h"
369683Slinton #include "names.h"
3714673Slinton #include "lists.h"
389683Slinton 
399683Slinton private String curformat = "X";
409683Slinton 
419683Slinton %}
429683Slinton 
439683Slinton %term
4416607Ssam     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP
459683Slinton     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
4618214Slinton     PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS STEP STEPI
4718214Slinton     STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE
4818214Slinton     WHATIS WHEN WHERE WHEREIS WHICH
499683Slinton 
5018214Slinton %term INT CHAR REAL NAME STRING
5118214Slinton %term ARROW
529683Slinton 
539683Slinton %right INT
549683Slinton %binary REDIRECT
559683Slinton %binary '<' '=' '>' '!' IN
569683Slinton %left '+' '-' OR
579683Slinton %left UNARYSIGN
589683Slinton %left '*' '/' DIV MOD AND
5918214Slinton %left '\\'
609683Slinton %left NOT '(' '[' '.' '^' ARROW
619683Slinton 
629683Slinton %union {
639683Slinton     Name y_name;
649683Slinton     Symbol y_sym;
659683Slinton     Node y_node;
669683Slinton     Integer y_int;
679683Slinton     Operator y_op;
689683Slinton     long y_long;
6918214Slinton     char y_char;
709683Slinton     double y_real;
719683Slinton     String y_string;
729683Slinton     Boolean y_bool;
739683Slinton     Cmdlist y_cmdlist;
7414673Slinton     List y_list;
759683Slinton };
769683Slinton 
779683Slinton %type <y_op>	    trace stop
7818214Slinton %type <y_long>	    INT count signal
7918214Slinton %type <y_char>	    CHAR
809683Slinton %type <y_real>	    REAL
819683Slinton %type <y_string>    STRING redirectout filename opt_filename mode
8216607Ssam %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT
8316607Ssam %type <y_name>	    DEBUG DELETE DIV DOWN DUMP
849683Slinton %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
859683Slinton %type <y_name>	    NEXT NEXTI NIL NOT OR
8618214Slinton %type <y_name>	    PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS
8716607Ssam %type <y_name>	    STEP STEPI STOP STOPI TRACE TRACEI
8818214Slinton %type <y_name>	    UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH
899683Slinton %type <y_name>	    name NAME keyword
9016607Ssam %type <y_node>      opt_qual_symbol symbol
919683Slinton %type <y_node>	    command rcommand cmd step what where examine
9212482Slinton %type <y_node>	    event opt_exp_list opt_cond
939683Slinton %type <y_node>	    exp_list exp term boolean_exp constant address
9416934Ssam %type <y_node>	    integer_list alias_command list_command line_number
959683Slinton %type <y_cmdlist>   actions
9618214Slinton %type <y_list>      sourcepath name_list
979683Slinton 
989683Slinton %%
999683Slinton 
1009683Slinton input:
1019683Slinton     input command_nl
1029683Slinton |
1039683Slinton     /* empty */
1049683Slinton ;
1059683Slinton command_nl:
1069683Slinton     command_line '\n'
10718214Slinton |
10818214Slinton     command_line ';'
10916926Ssam {
11018214Slinton 	chkalias = true;
11116926Ssam }
1129683Slinton |
1139683Slinton     '\n'
1149683Slinton ;
1159683Slinton 
1169683Slinton command_line:
1179683Slinton     command
1189683Slinton {
1199683Slinton 	if ($1 != nil) {
12018214Slinton 	    topeval($1);
1219683Slinton 	}
1229683Slinton }
1239683Slinton |
1249683Slinton     rcommand redirectout
1259683Slinton {
1269683Slinton 	if ($1 != nil) {
1279683Slinton 	    if ($2 != nil) {
1289683Slinton 		setout($2);
12918214Slinton 		topeval($1);
1309683Slinton 		unsetout();
1319683Slinton 	    } else {
13218214Slinton 		topeval($1);
1339683Slinton 	    }
1349683Slinton 	}
1359683Slinton }
1369683Slinton ;
1379683Slinton redirectout:
1389683Slinton     '>' shellmode NAME
1399683Slinton {
1409683Slinton 	$$ = ident($3);
1419683Slinton }
1429683Slinton |
1439683Slinton     /* empty */
1449683Slinton {
1459683Slinton 	$$ = nil;
1469683Slinton }
1479683Slinton ;
1489683Slinton 
1499683Slinton /*
1509683Slinton  * Non-redirectable commands.
1519683Slinton  */
1529683Slinton command:
1539683Slinton     alias_command
1549683Slinton {
1559683Slinton 	$$ = $1;
1569683Slinton }
1579683Slinton |
15818214Slinton     ASSIGN exp '=' exp
1599683Slinton {
16018214Slinton 	$$ = build(O_ASSIGN, unrval($2), $4);
1619683Slinton }
1629683Slinton |
16318214Slinton     CATCH signal
1649683Slinton {
16518214Slinton 	$$ = build(O_CATCH, $2);
1669683Slinton }
1679683Slinton |
16818214Slinton     CATCH
16916926Ssam {
17018214Slinton 	$$ = build(O_CATCH, 0);
17116926Ssam }
17216926Ssam |
1739683Slinton     CONT
1749683Slinton {
17514673Slinton 	$$ = build(O_CONT, (long) DEFSIG);
1769683Slinton }
1779683Slinton |
17818214Slinton     CONT signal
17911870Slinton {
18011870Slinton 	$$ = build(O_CONT, $2);
18111870Slinton }
18211870Slinton |
18316934Ssam     DELETE integer_list
1849683Slinton {
1859683Slinton 	$$ = build(O_DELETE, $2);
1869683Slinton }
1879683Slinton |
18816607Ssam     DOWN
18916607Ssam {
19016607Ssam 	$$ = build(O_DOWN, build(O_LCON, (long) 1));
19116607Ssam }
19216607Ssam |
19316607Ssam     DOWN INT
19416607Ssam {
19516607Ssam 	$$ = build(O_DOWN, build(O_LCON, (long) $2));
19616607Ssam }
19716607Ssam |
1989683Slinton     EDIT shellmode opt_filename
1999683Slinton {
2009683Slinton 	$$ = build(O_EDIT, $3);
2019683Slinton }
2029683Slinton |
2039683Slinton     FILE shellmode opt_filename
2049683Slinton {
2059683Slinton 	$$ = build(O_CHFILE, $3);
2069683Slinton }
2079683Slinton |
2089683Slinton     FUNC
2099683Slinton {
2109683Slinton 	$$ = build(O_FUNC, nil);
2119683Slinton }
2129683Slinton |
21318214Slinton     FUNC opt_qual_symbol
2149683Slinton {
21518214Slinton 	$$ = build(O_FUNC, $2);
2169683Slinton }
2179683Slinton |
2189683Slinton     GRIPE
2199683Slinton {
2209683Slinton 	$$ = build(O_GRIPE);
2219683Slinton }
2229683Slinton |
2239683Slinton     HELP
2249683Slinton {
2259683Slinton 	$$ = build(O_HELP);
2269683Slinton }
2279683Slinton |
22818214Slinton     IGNORE signal
2299683Slinton {
23018214Slinton 	$$ = build(O_IGNORE, $2);
2319683Slinton }
2329683Slinton |
23318214Slinton     IGNORE
23416926Ssam {
23518214Slinton 	$$ = build(O_IGNORE, 0);
23616926Ssam }
23716926Ssam |
2389683Slinton     list_command
2399683Slinton {
2409683Slinton 	$$ = $1;
2419683Slinton }
2429683Slinton |
24318214Slinton     PSYM exp
2449683Slinton {
24518214Slinton 	$$ = build(O_PSYM, unrval($2));
2469683Slinton }
2479683Slinton |
2489683Slinton     QUIT
2499683Slinton {
2509683Slinton 	if (not popinput()) {
2519683Slinton 	    quit(0);
2529683Slinton 	} else {
2539683Slinton 	    $$ = nil;
2549683Slinton 	}
2559683Slinton }
2569683Slinton |
25716607Ssam     RETURN
25816607Ssam {
25916607Ssam 	$$ = build(O_RETURN, nil);
26016607Ssam }
26116607Ssam |
26218214Slinton     RETURN opt_qual_symbol
26316607Ssam {
26418214Slinton 	$$ = build(O_RETURN, $2);
26516607Ssam }
26616607Ssam |
2679683Slinton     runcommand
2689683Slinton {
2699683Slinton 	run();
2709683Slinton 	/* NOTREACHED */
2719683Slinton }
2729683Slinton |
27318214Slinton     SET name '=' exp
27418214Slinton {
27518214Slinton 	$$ = build(O_SET, build(O_NAME, $2), $4);
27618214Slinton }
27718214Slinton |
27818214Slinton     SET name
27918214Slinton {
28018214Slinton 	$$ = build(O_SET, build(O_NAME, $2), nil);
28118214Slinton }
28218214Slinton |
28318214Slinton     SET
28418214Slinton {
28518214Slinton 	$$ = build(O_SET, nil, nil);
28618214Slinton }
28718214Slinton |
2889683Slinton     SH
2899683Slinton {
2909683Slinton 	shellline();
2919683Slinton 	$$ = nil;
2929683Slinton }
2939683Slinton |
2949683Slinton     SOURCE shellmode filename
2959683Slinton {
2969683Slinton 	$$ = build(O_SOURCE, $3);
2979683Slinton }
2989683Slinton |
2999683Slinton     step
3009683Slinton {
3019683Slinton 	$$ = $1;
3029683Slinton }
3039683Slinton |
3049683Slinton     stop where opt_cond
3059683Slinton {
3069683Slinton 	$$ = build($1, nil, $2, $3);
3079683Slinton }
3089683Slinton |
3099683Slinton     stop what opt_cond
3109683Slinton {
3119683Slinton 	$$ = build($1, $2, nil, $3);
3129683Slinton }
3139683Slinton |
3149683Slinton     stop IF boolean_exp
3159683Slinton {
3169683Slinton 	$$ = build($1, nil, nil, $3);
3179683Slinton }
3189683Slinton |
3199683Slinton     trace what where opt_cond
3209683Slinton {
3219683Slinton 	$$ = build($1, $2, $3, $4);
3229683Slinton }
3239683Slinton |
3249683Slinton     trace where opt_cond
3259683Slinton {
3269683Slinton 	$$ = build($1, nil, $2, $3);
3279683Slinton }
3289683Slinton |
3299683Slinton     trace what opt_cond
3309683Slinton {
3319683Slinton 	$$ = build($1, $2, nil, $3);
3329683Slinton }
3339683Slinton |
3349683Slinton     trace opt_cond
3359683Slinton {
3369683Slinton 	$$ = build($1, nil, nil, $2);
3379683Slinton }
3389683Slinton |
33918214Slinton     UNALIAS name
34018214Slinton {
34118214Slinton 	$$ = build(O_UNALIAS, build(O_NAME, $2));
34218214Slinton }
34318214Slinton |
34418214Slinton     UNSET name
34518214Slinton {
34618214Slinton 	$$ = build(O_UNSET, build(O_NAME, $2));
34718214Slinton }
34818214Slinton |
34916607Ssam     UP
3509683Slinton {
35116607Ssam 	$$ = build(O_UP, build(O_LCON, (long) 1));
3529683Slinton }
3539683Slinton |
35416607Ssam     UP INT
3559683Slinton {
35616607Ssam 	$$ = build(O_UP, build(O_LCON, (long) $2));
3579683Slinton }
3589683Slinton |
3599683Slinton     USE shellmode sourcepath
3609683Slinton {
36114673Slinton 	String dir;
36214673Slinton 
3639683Slinton 	$$ = nil;
36414673Slinton 	if (list_size($3) == 0) {
36514673Slinton 	    foreach (String, dir, sourcepath)
36614673Slinton 		printf("%s ", dir);
36714673Slinton 	    endfor
36814673Slinton 	    printf("\n");
36914673Slinton 	} else {
37014673Slinton 	    foreach (String, dir, sourcepath)
37114673Slinton 		list_delete(list_curitem(sourcepath), sourcepath);
37214673Slinton 	    endfor
37314673Slinton 	    sourcepath = $3;
3749683Slinton 	}
3759683Slinton }
37616604Ssam |
37718214Slinton     WHATIS opt_qual_symbol
37816604Ssam {
37918214Slinton 	$$ = build(O_WHATIS, $2);
38016604Ssam }
38116607Ssam |
38218214Slinton     WHEN event '{' actions '}'
38316604Ssam {
38418214Slinton 	$$ = build(O_ADDEVENT, $2, $4);
38516604Ssam }
38616604Ssam |
38718214Slinton     WHEREIS name
38816604Ssam {
38918214Slinton 	$$ = build(O_WHEREIS, build(O_SYM, lookup($2)));
39016604Ssam }
39116607Ssam |
39218214Slinton     WHICH symbol
39316604Ssam {
39418214Slinton 	$$ = build(O_WHICH, $2);
39516604Ssam }
39616625Ssam |
39718214Slinton     '/'
39816625Ssam {
39918214Slinton 	$$ = build(O_SEARCH,
40018214Slinton 	    build(O_LCON, (long) '/'),
40118214Slinton 	    build(O_SCON, strdup(scanner_linebuf))
40218214Slinton 	);
40318214Slinton 	gobble();
40418214Slinton 	insertinput("\n");
40516625Ssam }
40616625Ssam |
40718214Slinton     '?'
40816625Ssam {
40918214Slinton 	$$ = build(O_SEARCH,
41018214Slinton 	    build(O_LCON, (long) '?'),
41118214Slinton 	    build(O_SCON, strdup(scanner_linebuf))
41218214Slinton 	);
41318214Slinton 	gobble();
41418214Slinton 	insertinput("\n");
41516625Ssam }
41616625Ssam ;
41716926Ssam signal:
41816926Ssam     INT
41916926Ssam {
42018214Slinton 	$$ = $1;
42116926Ssam }
42216926Ssam |
42318214Slinton     name
42416926Ssam {
42518214Slinton 	$$ = siglookup(ident($1));
42616926Ssam }
42716926Ssam ;
4289683Slinton runcommand:
42916607Ssam     run arglist
43012482Slinton |
43112524Slinton     run
4329683Slinton ;
4339683Slinton run:
43412524Slinton     RUN shellmode
4359683Slinton {
43616607Ssam 	arginit();
4379683Slinton 	fflush(stdout);
4389683Slinton }
43916607Ssam |
44016607Ssam     RERUN shellmode
44116607Ssam {
44216607Ssam 	fflush(stdout);
44316607Ssam }
4449683Slinton ;
4459683Slinton arglist:
4469683Slinton     arglist arg
4479683Slinton |
44812482Slinton     arg
4499683Slinton ;
4509683Slinton arg:
45118214Slinton     NAME
4529683Slinton {
4539683Slinton 	newarg(ident($1));
4549683Slinton }
4559683Slinton |
45618214Slinton     STRING
45716607Ssam {
45816607Ssam 	newarg($1);
45916607Ssam }
46016607Ssam |
4619683Slinton     '<' NAME
4629683Slinton {
4639683Slinton 	inarg(ident($2));
4649683Slinton }
4659683Slinton |
4669683Slinton     '>' NAME
4679683Slinton {
4689683Slinton 	outarg(ident($2));
4699683Slinton }
4709683Slinton ;
4719683Slinton step:
47218214Slinton     STEP
4739683Slinton {
4749683Slinton 	$$ = build(O_STEP, true, false);
4759683Slinton }
4769683Slinton |
47718214Slinton     STEPI
4789683Slinton {
4799683Slinton 	$$ = build(O_STEP, false, false);
4809683Slinton }
4819683Slinton |
48218214Slinton     NEXT
4839683Slinton {
4849683Slinton 	$$ = build(O_STEP, true, true);
4859683Slinton }
4869683Slinton |
48718214Slinton     NEXTI
4889683Slinton {
4899683Slinton 	$$ = build(O_STEP, false, true);
4909683Slinton }
4919683Slinton ;
4929683Slinton shellmode:
4939683Slinton     /* empty */
4949683Slinton {
4959683Slinton 	beginshellmode();
4969683Slinton }
4979683Slinton ;
4989683Slinton sourcepath:
4999683Slinton     sourcepath NAME
5009683Slinton {
50114673Slinton 	$$ = $1;
50214673Slinton 	list_append(list_item(ident($2)), nil, $$);
5039683Slinton }
5049683Slinton |
5059683Slinton     /* empty */
5069683Slinton {
50714673Slinton 	$$ = list_alloc();
5089683Slinton }
5099683Slinton ;
5109683Slinton event:
5119683Slinton     where
5129683Slinton |
5139683Slinton     exp
5149683Slinton ;
5159683Slinton actions:
5169683Slinton     actions cmd ';'
5179683Slinton {
5189683Slinton 	$$ = $1;
5199683Slinton 	cmdlist_append($2, $$);
5209683Slinton }
5219683Slinton |
5229683Slinton     cmd ';'
5239683Slinton {
5249683Slinton 	$$ = list_alloc();
5259683Slinton 	cmdlist_append($1, $$);
5269683Slinton }
5279683Slinton ;
5289683Slinton cmd:
5299683Slinton     command
5309683Slinton |
5319683Slinton     rcommand
5329683Slinton ;
5339683Slinton 
5349683Slinton /*
5359683Slinton  * Redirectable commands.
5369683Slinton  */
5379683Slinton rcommand:
53818214Slinton     PRINT exp_list
5399683Slinton {
54018214Slinton 	$$ = build(O_PRINT, $2);
5419683Slinton }
5429683Slinton |
5439683Slinton     WHERE
5449683Slinton {
5459683Slinton 	$$ = build(O_WHERE);
5469683Slinton }
5479683Slinton |
5489683Slinton     examine
5499683Slinton {
5509683Slinton 	$$ = $1;
5519683Slinton }
5529683Slinton |
55318214Slinton     CALL term '(' opt_exp_list ')'
5549683Slinton {
55518214Slinton 	$$ = build(O_CALLPROC, $2, $4);
5569683Slinton }
5579683Slinton |
55812536Scsvaf     DEBUG INT
55912536Scsvaf {
56012536Scsvaf  	$$ = build(O_DEBUG, $2);
56112536Scsvaf }
56212536Scsvaf |
56318214Slinton     DEBUG '-' INT
56418214Slinton {
56518214Slinton 	$$ = build(O_DEBUG, -$3);
56618214Slinton }
56718214Slinton |
56818214Slinton     DUMP opt_qual_symbol
56918214Slinton {
57018214Slinton 	$$ = build(O_DUMP, $2);
57118214Slinton }
57218214Slinton |
57318214Slinton     DUMP '.'
57418214Slinton {
57518214Slinton 	$$ = build(O_DUMP, nil);
57618214Slinton }
57718214Slinton |
5789683Slinton     DUMP
5799683Slinton {
58018214Slinton 	$$ = build(O_DUMP, build(O_SYM, curfunc));
5819683Slinton }
5829683Slinton |
5839683Slinton     STATUS
5849683Slinton {
5859683Slinton 	$$ = build(O_STATUS);
5869683Slinton }
5879683Slinton ;
5889683Slinton alias_command:
58918214Slinton     ALIAS name name
5909683Slinton {
59118214Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
5929683Slinton }
5939683Slinton |
59418214Slinton     ALIAS name STRING
5959683Slinton {
59618214Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_SCON, $3));
59718214Slinton }
59818214Slinton |
59918214Slinton     ALIAS name '(' name_list ')' STRING
60018214Slinton {
60118214Slinton 	$$ = build(O_ALIAS,
60218214Slinton 	    build(O_COMMA, build(O_NAME, $2), (Node) $4),
60318214Slinton 	    build(O_SCON, $6)
60418214Slinton 	);
60518214Slinton }
60618214Slinton |
60718214Slinton     ALIAS name
60818214Slinton {
6099683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
6109683Slinton }
6119683Slinton |
61218214Slinton     ALIAS
6139683Slinton {
6149683Slinton 	$$ = build(O_ALIAS, nil, nil);
6159683Slinton }
6169683Slinton ;
61718214Slinton name_list:
61818214Slinton     name_list ',' name
61916926Ssam {
62018214Slinton 	$$ = $1;
62118214Slinton 	list_append(list_item($3), nil, $$);
62216926Ssam }
62318214Slinton |
62418214Slinton     name
62518214Slinton {
62618214Slinton 	$$ = list_alloc();
62718214Slinton 	list_append(list_item($1), nil, $$);
62818214Slinton }
62916926Ssam ;
6309683Slinton trace:
63118214Slinton     TRACE
6329683Slinton {
6339683Slinton 	$$ = O_TRACE;
6349683Slinton }
6359683Slinton |
63618214Slinton     TRACEI
6379683Slinton {
6389683Slinton 	$$ = O_TRACEI;
6399683Slinton }
6409683Slinton ;
6419683Slinton stop:
64218214Slinton     STOP
6439683Slinton {
6449683Slinton 	$$ = O_STOP;
6459683Slinton }
6469683Slinton |
64718214Slinton     STOPI
6489683Slinton {
6499683Slinton 	$$ = O_STOPI;
6509683Slinton }
6519683Slinton ;
6529683Slinton what:
6539683Slinton     exp
6549683Slinton {
6559683Slinton 	$$ = $1;
6569683Slinton }
6579683Slinton |
6589683Slinton     STRING ':' line_number
6599683Slinton {
6609683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
6619683Slinton }
6629683Slinton ;
6639683Slinton where:
66418214Slinton     IN exp
6659683Slinton {
66618214Slinton 	$$ = unrval($2);
6679683Slinton }
6689683Slinton |
6699683Slinton     AT line_number
6709683Slinton {
67118214Slinton 	$$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2);
6729683Slinton }
6739683Slinton |
6749683Slinton     AT STRING ':' line_number
6759683Slinton {
6769683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
6779683Slinton }
6789683Slinton ;
6799683Slinton filename:
6809683Slinton     NAME
6819683Slinton {
6829683Slinton 	$$ = ident($1);
6839683Slinton }
6849683Slinton ;
6859683Slinton opt_filename:
6869683Slinton     /* empty */
6879683Slinton {
6889683Slinton 	$$ = nil;
6899683Slinton }
6909683Slinton |
6919683Slinton     filename
6929683Slinton {
6939683Slinton 	$$ = $1;
6949683Slinton }
6959683Slinton ;
69612482Slinton opt_exp_list:
69712482Slinton     exp_list
6989683Slinton {
69912482Slinton 	$$ = $1;
7009683Slinton }
7019683Slinton |
70212482Slinton     /* empty */
7039683Slinton {
70412482Slinton 	$$ = nil;
7059683Slinton }
7069683Slinton ;
7079683Slinton list_command:
70818214Slinton     LIST
7099683Slinton {
7109683Slinton 	$$ = build(O_LIST,
7119683Slinton 	    build(O_LCON, (long) cursrcline),
71233312Sdonn 	    build(O_LCON, (long) cursrcline + srcwindowlen() - 1)
7139683Slinton 	);
7149683Slinton }
7159683Slinton |
71618214Slinton     LIST line_number
7179683Slinton {
7189683Slinton 	$$ = build(O_LIST, $2, $2);
7199683Slinton }
7209683Slinton |
72118214Slinton     LIST line_number ',' line_number
7229683Slinton {
7239683Slinton 	$$ = build(O_LIST, $2, $4);
7249683Slinton }
7259683Slinton |
72618214Slinton     LIST opt_qual_symbol
7279683Slinton {
72833312Sdonn 	$$ = build(O_LIST, $2, $2);
7299683Slinton }
7309683Slinton ;
73118214Slinton integer_list:
73218214Slinton     INT
73318214Slinton {
73418214Slinton 	$$ = build(O_LCON, $1);
73518214Slinton }
73618214Slinton |
73718214Slinton     INT integer_list
73818214Slinton {
73918214Slinton 	$$ = build(O_COMMA, build(O_LCON, $1), $2);
74018214Slinton }
74116607Ssam ;
7429683Slinton line_number:
7439683Slinton     INT
7449683Slinton {
7459683Slinton 	$$ = build(O_LCON, $1);
7469683Slinton }
7479683Slinton |
7489683Slinton     '$'
7499683Slinton {
7509683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
7519683Slinton }
7529683Slinton ;
7539683Slinton examine:
7549683Slinton     address '/' count mode
7559683Slinton {
7569683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
7579683Slinton }
7589683Slinton |
7599683Slinton     address ',' address '/' mode
7609683Slinton {
7619683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
7629683Slinton }
7639683Slinton |
76411173Slinton     address '=' mode
76511173Slinton {
76611173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
76711173Slinton }
7689683Slinton ;
7699683Slinton address:
77018214Slinton     INT
7719683Slinton {
7729683Slinton 	$$ = build(O_LCON, $1);
7739683Slinton }
7749683Slinton |
77518214Slinton     '.'
7769683Slinton {
77718214Slinton 	$$ = build(O_LCON, (long) prtaddr);
7789683Slinton }
7799683Slinton |
78018214Slinton     '&' term
78118214Slinton {
78218214Slinton 	$$ = amper($2);
78318214Slinton }
78418214Slinton |
7859683Slinton     address '+' address
7869683Slinton {
7879683Slinton 	$$ = build(O_ADD, $1, $3);
7889683Slinton }
7899683Slinton |
7909683Slinton     address '-' address
7919683Slinton {
7929683Slinton 	$$ = build(O_SUB, $1, $3);
7939683Slinton }
7949683Slinton |
7959683Slinton     address '*' address
7969683Slinton {
7979683Slinton 	$$ = build(O_MUL, $1, $3);
7989683Slinton }
7999683Slinton |
80018214Slinton     '*' address %prec UNARYSIGN
8019683Slinton {
80218214Slinton 	$$ = build(O_INDIR, $2);
8039683Slinton }
8049683Slinton |
80518214Slinton     '-' address %prec UNARYSIGN
8069683Slinton {
80718214Slinton 	$$ = build(O_NEG, $2);
8089683Slinton }
80918214Slinton |
81018214Slinton     '(' exp ')'
81118214Slinton {
81218214Slinton 	$$ = $2;
81318214Slinton }
8149683Slinton ;
81518214Slinton term:
81618214Slinton     symbol
81718214Slinton {
81818214Slinton 	$$ = $1;
81918214Slinton }
82018214Slinton |
82118214Slinton     term '.' name
82218214Slinton {
82318214Slinton 	$$ = unrval(dot($1, $3));
82418214Slinton }
82518214Slinton |
82618214Slinton     term ARROW name
82718214Slinton {
82818214Slinton 	$$ = unrval(dot($1, $3));
82918214Slinton }
83018214Slinton |
83118214Slinton     term '[' exp_list ']'
83218214Slinton {
83318214Slinton 	$$ = unrval(subscript($1, $3));
83418214Slinton }
83518214Slinton ;
8369683Slinton count:
8379683Slinton     /* empty */
8389683Slinton {
8399683Slinton 	$$ = 1;
8409683Slinton }
8419683Slinton |
8429683Slinton     INT
8439683Slinton {
8449683Slinton 	$$ = $1;
8459683Slinton }
8469683Slinton ;
8479683Slinton mode:
8489683Slinton     name
8499683Slinton {
8509683Slinton 	$$ = ident($1);
8519683Slinton 	curformat = $$;
8529683Slinton }
8539683Slinton |
8549683Slinton     /* empty */
8559683Slinton {
8569683Slinton 	$$ = curformat;
8579683Slinton }
8589683Slinton ;
8599683Slinton opt_cond:
8609683Slinton     /* empty */
8619683Slinton {
8629683Slinton 	$$ = nil;
8639683Slinton }
8649683Slinton |
8659683Slinton     IF boolean_exp
8669683Slinton {
8679683Slinton 	$$ = $2;
8689683Slinton }
8699683Slinton ;
8709683Slinton exp_list:
8719683Slinton     exp
8729683Slinton {
8739683Slinton 	$$ = build(O_COMMA, $1, nil);
8749683Slinton }
8759683Slinton |
8769683Slinton     exp ',' exp_list
8779683Slinton {
8789683Slinton 	$$ = build(O_COMMA, $1, $3);
8799683Slinton }
8809683Slinton ;
8819683Slinton exp:
88218214Slinton     symbol
8839683Slinton {
8849683Slinton 	$$ = build(O_RVAL, $1);
8859683Slinton }
8869683Slinton |
88718214Slinton     exp '[' exp_list ']'
8889683Slinton {
88918214Slinton 	$$ = subscript(unrval($1), $3);
8909683Slinton }
8919683Slinton |
89218214Slinton     exp '.' name
89318214Slinton {
89418214Slinton 	$$ = dot($1, $3);
89518214Slinton }
89618214Slinton |
89718214Slinton     exp ARROW name
89818214Slinton {
89918214Slinton 	$$ = dot($1, $3);
90018214Slinton }
90118214Slinton |
90218214Slinton     '*' exp %prec UNARYSIGN
90318214Slinton {
90418214Slinton 	$$ = build(O_INDIR, $2);
90518214Slinton }
90618214Slinton |
90718214Slinton     exp '^' %prec UNARYSIGN
90818214Slinton {
90918214Slinton 	$$ = build(O_INDIR, $1);
91018214Slinton }
91118214Slinton |
91216607Ssam     exp '\\' opt_qual_symbol
91311173Slinton {
91411173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
91511173Slinton }
91611173Slinton |
91718214Slinton     exp '\\' '&' opt_qual_symbol %prec '\\'
91818214Slinton {
91918214Slinton 	$$ = renameptr($1, $4);
92018214Slinton }
92118214Slinton |
92218214Slinton     exp '(' opt_exp_list ')'
92318214Slinton {
92418214Slinton 	$$ = build(O_CALL, unrval($1), $3);
92518214Slinton }
92618214Slinton |
92718214Slinton     constant
92818214Slinton {
92918214Slinton 	$$ = $1;
93018214Slinton }
93118214Slinton |
9329683Slinton     '+' exp %prec UNARYSIGN
9339683Slinton {
9349683Slinton 	$$ = $2;
9359683Slinton }
9369683Slinton |
9379683Slinton     '-' exp %prec UNARYSIGN
9389683Slinton {
9399683Slinton 	$$ = build(O_NEG, $2);
9409683Slinton }
9419683Slinton |
9429683Slinton     '&' exp %prec UNARYSIGN
9439683Slinton {
9449683Slinton 	$$ = amper($2);
9459683Slinton }
9469683Slinton |
9479683Slinton     exp '+' exp
9489683Slinton {
9499683Slinton 	$$ = build(O_ADD, $1, $3);
9509683Slinton }
9519683Slinton |
9529683Slinton     exp '-' exp
9539683Slinton {
9549683Slinton 	$$ = build(O_SUB, $1, $3);
9559683Slinton }
9569683Slinton |
9579683Slinton     exp '*' exp
9589683Slinton {
9599683Slinton 	$$ = build(O_MUL, $1, $3);
9609683Slinton }
9619683Slinton |
9629683Slinton     exp '/' exp
9639683Slinton {
9649683Slinton 	$$ = build(O_DIVF, $1, $3);
9659683Slinton }
9669683Slinton |
9679683Slinton     exp DIV exp
9689683Slinton {
9699683Slinton 	$$ = build(O_DIV, $1, $3);
9709683Slinton }
9719683Slinton |
9729683Slinton     exp MOD exp
9739683Slinton {
9749683Slinton 	$$ = build(O_MOD, $1, $3);
9759683Slinton }
9769683Slinton |
9779683Slinton     exp AND exp
9789683Slinton {
9799683Slinton 	$$ = build(O_AND, $1, $3);
9809683Slinton }
9819683Slinton |
9829683Slinton     exp OR exp
9839683Slinton {
9849683Slinton 	$$ = build(O_OR, $1, $3);
9859683Slinton }
9869683Slinton |
9879683Slinton     exp '<' exp
9889683Slinton {
9899683Slinton 	$$ = build(O_LT, $1, $3);
9909683Slinton }
9919683Slinton |
9929683Slinton     exp '<' '=' exp
9939683Slinton {
9949683Slinton 	$$ = build(O_LE, $1, $4);
9959683Slinton }
9969683Slinton |
9979683Slinton     exp '>' exp
9989683Slinton {
9999683Slinton 	$$ = build(O_GT, $1, $3);
10009683Slinton }
10019683Slinton |
10029683Slinton     exp '>' '=' exp
10039683Slinton {
10049683Slinton 	$$ = build(O_GE, $1, $4);
10059683Slinton }
10069683Slinton |
10079683Slinton     exp '=' exp
10089683Slinton {
10099683Slinton 	$$ = build(O_EQ, $1, $3);
10109683Slinton }
10119683Slinton |
10129683Slinton     exp '=' '=' exp
10139683Slinton {
10149683Slinton 	$$ = build(O_EQ, $1, $4);
10159683Slinton }
10169683Slinton |
10179683Slinton     exp '<' '>' exp
10189683Slinton {
10199683Slinton 	$$ = build(O_NE, $1, $4);
10209683Slinton }
10219683Slinton |
10229683Slinton     exp '!' '=' exp
10239683Slinton {
10249683Slinton 	$$ = build(O_NE, $1, $4);
10259683Slinton }
10269683Slinton |
10279683Slinton     '(' exp ')'
10289683Slinton {
10299683Slinton 	$$ = $2;
10309683Slinton }
10319683Slinton ;
10329683Slinton boolean_exp:
10339683Slinton     exp
10349683Slinton {
10359683Slinton 	chkboolean($1);
10369683Slinton 	$$ = $1;
10379683Slinton }
10389683Slinton ;
10399683Slinton constant:
10409683Slinton     INT
10419683Slinton {
10429683Slinton 	$$ = build(O_LCON, $1);
10439683Slinton }
10449683Slinton |
104518214Slinton     CHAR
104618214Slinton {
104718214Slinton 	$$ = build(O_CCON, $1);
104818214Slinton }
104918214Slinton |
10509683Slinton     REAL
10519683Slinton {
10529683Slinton 	$$ = build(O_FCON, $1);
10539683Slinton }
10549683Slinton |
10559683Slinton     STRING
10569683Slinton {
10579683Slinton 	$$ = build(O_SCON, $1);
10589683Slinton }
10599683Slinton ;
106016607Ssam opt_qual_symbol:
106116607Ssam     symbol
106216607Ssam {
106316607Ssam 	$$ = $1;
106416607Ssam }
106516607Ssam |
106616607Ssam     opt_qual_symbol '.' name
106716607Ssam {
106816607Ssam 	$$ = dot($1, $3);
106916607Ssam }
107016607Ssam ;
10719683Slinton symbol:
10729683Slinton     name
10739683Slinton {
107418214Slinton 	$$ = findvar($1);
107518214Slinton 	if ($$ == nil) {
107618214Slinton 	    $$ = build(O_SYM, which($1));
107718214Slinton 	}
10789683Slinton }
107916607Ssam |
108016607Ssam     '.' name
108116607Ssam {
108216607Ssam 	$$ = dot(build(O_SYM, program), $2);
108316607Ssam }
10849683Slinton ;
10859683Slinton name:
10869683Slinton     NAME
10879683Slinton {
10889683Slinton 	$$ = $1;
10899683Slinton }
10909683Slinton |
10919683Slinton     keyword
10929683Slinton {
10939683Slinton 	$$ = $1;
10949683Slinton }
10959683Slinton keyword:
109612536Scsvaf     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV |
109716607Ssam     DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST |
109816607Ssam     MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT |
109918214Slinton     RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | STATUS | STEP | STEPI |
110018214Slinton     STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE |
110118214Slinton     WHATIS | WHEN | WHERE | WHEREIS | WHICH
11029683Slinton ;
1103