xref: /csrg-svn/old/dbx/commands.y (revision 16625)
19683Slinton %{
29683Slinton 
39683Slinton /* Copyright (c) 1982 Regents of the University of California */
49683Slinton 
5*16625Ssam static	char sccsid[] = "@(#)commands.y	1.11 (Berkeley) 06/23/84";
69683Slinton 
79683Slinton /*
89683Slinton  * Yacc grammar for debugger commands.
99683Slinton  */
109683Slinton 
119683Slinton #include "defs.h"
129683Slinton #include "symbols.h"
139683Slinton #include "operators.h"
149683Slinton #include "tree.h"
159683Slinton #include "process.h"
169683Slinton #include "source.h"
179683Slinton #include "scanner.h"
189683Slinton #include "names.h"
1914673Slinton #include "lists.h"
209683Slinton 
219683Slinton private String curformat = "X";
229683Slinton 
239683Slinton %}
249683Slinton 
259683Slinton %term
2616607Ssam     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP
279683Slinton     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
2816607Ssam     PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS STEP STEPI
2916607Ssam     STOP STOPI TRACE TRACEI UP
309683Slinton     USE WHATIS WHEN WHERE WHEREIS WHICH
319683Slinton 
329683Slinton %term INT REAL NAME STRING
339683Slinton %term LFORMER RFORMER ABSTRACTION ARROW
349683Slinton 
359683Slinton %right INT
369683Slinton %binary REDIRECT
379683Slinton %binary '<' '=' '>' '!' IN
389683Slinton %left '+' '-' OR
399683Slinton %left UNARYSIGN
409683Slinton %left '*' '/' DIV MOD AND
419683Slinton %left NOT '(' '[' '.' '^' ARROW
4211173Slinton %left '\\'
439683Slinton 
449683Slinton %union {
459683Slinton     Name y_name;
469683Slinton     Symbol y_sym;
479683Slinton     Node y_node;
489683Slinton     Integer y_int;
499683Slinton     Operator y_op;
509683Slinton     long y_long;
519683Slinton     double y_real;
529683Slinton     String y_string;
539683Slinton     Boolean y_bool;
549683Slinton     Cmdlist y_cmdlist;
5514673Slinton     List y_list;
569683Slinton };
579683Slinton 
589683Slinton %type <y_op>	    trace stop
599683Slinton %type <y_long>	    INT count
609683Slinton %type <y_real>	    REAL
619683Slinton %type <y_string>    STRING redirectout filename opt_filename mode
6216607Ssam %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT
6316607Ssam %type <y_name>	    DEBUG DELETE DIV DOWN DUMP
649683Slinton %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
659683Slinton %type <y_name>	    NEXT NEXTI NIL NOT OR
6616607Ssam %type <y_name>	    PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS
6716607Ssam %type <y_name>	    STEP STEPI STOP STOPI TRACE TRACEI
6816607Ssam %type <y_name>	    UP USE WHATIS WHEN WHERE WHEREIS WHICH
699683Slinton %type <y_name>	    name NAME keyword
7016607Ssam %type <y_node>      opt_qual_symbol symbol
719683Slinton %type <y_node>	    command rcommand cmd step what where examine
7212482Slinton %type <y_node>	    event opt_exp_list opt_cond
739683Slinton %type <y_node>	    exp_list exp term boolean_exp constant address
7416607Ssam %type <y_node>	    integer_list alias_command list_command line_number
75*16625Ssam %type <y_node>	    search_command pattern
769683Slinton %type <y_cmdlist>   actions
7714673Slinton %type <y_list>      sourcepath
789683Slinton 
799683Slinton %%
809683Slinton 
819683Slinton input:
829683Slinton     input command_nl
839683Slinton |
849683Slinton     /* empty */
859683Slinton ;
869683Slinton command_nl:
879683Slinton     command_line '\n'
889683Slinton |
899683Slinton     command_line ';'
909683Slinton |
919683Slinton     '\n'
929683Slinton ;
939683Slinton 
949683Slinton command_line:
959683Slinton     command
969683Slinton {
979683Slinton 	if ($1 != nil) {
9812536Scsvaf             if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
999683Slinton 	    eval($1);
1009683Slinton 	}
1019683Slinton }
1029683Slinton |
1039683Slinton     rcommand redirectout
1049683Slinton {
1059683Slinton 	if ($1 != nil) {
1069683Slinton 	    if ($2 != nil) {
1079683Slinton 		setout($2);
10812536Scsvaf                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
1099683Slinton 		eval($1);
1109683Slinton 		unsetout();
1119683Slinton 	    } else {
11212536Scsvaf                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
1139683Slinton 		eval($1);
1149683Slinton 	    }
1159683Slinton 	}
1169683Slinton }
1179683Slinton ;
1189683Slinton redirectout:
1199683Slinton     '>' shellmode NAME
1209683Slinton {
1219683Slinton 	$$ = ident($3);
1229683Slinton }
1239683Slinton |
1249683Slinton     /* empty */
1259683Slinton {
1269683Slinton 	$$ = nil;
1279683Slinton }
1289683Slinton ;
1299683Slinton 
1309683Slinton /*
1319683Slinton  * Non-redirectable commands.
1329683Slinton  */
1339683Slinton command:
1349683Slinton     alias_command
1359683Slinton {
1369683Slinton 	$$ = $1;
1379683Slinton }
1389683Slinton |
1399683Slinton     ASSIGN term '=' exp
1409683Slinton {
1419683Slinton 	$$ = build(O_ASSIGN, $2, $4);
1429683Slinton }
1439683Slinton |
1449683Slinton     CATCH INT
1459683Slinton {
1469683Slinton 	$$ = build(O_CATCH, $2);
1479683Slinton }
1489683Slinton |
1499683Slinton     CONT
1509683Slinton {
15114673Slinton 	$$ = build(O_CONT, (long) DEFSIG);
1529683Slinton }
1539683Slinton |
15411870Slinton     CONT INT
15511870Slinton {
15611870Slinton 	$$ = build(O_CONT, $2);
15711870Slinton }
15811870Slinton |
15916607Ssam     DELETE integer_list
1609683Slinton {
1619683Slinton 	$$ = build(O_DELETE, $2);
1629683Slinton }
1639683Slinton |
16416607Ssam     DOWN
16516607Ssam {
16616607Ssam 	$$ = build(O_DOWN, build(O_LCON, (long) 1));
16716607Ssam }
16816607Ssam |
16916607Ssam     DOWN INT
17016607Ssam {
17116607Ssam 	$$ = build(O_DOWN, build(O_LCON, (long) $2));
17216607Ssam }
17316607Ssam |
1749683Slinton     EDIT shellmode opt_filename
1759683Slinton {
1769683Slinton 	$$ = build(O_EDIT, $3);
1779683Slinton }
1789683Slinton |
1799683Slinton     FILE shellmode opt_filename
1809683Slinton {
1819683Slinton 	$$ = build(O_CHFILE, $3);
1829683Slinton }
1839683Slinton |
1849683Slinton     FUNC
1859683Slinton {
1869683Slinton 	$$ = build(O_FUNC, nil);
1879683Slinton }
1889683Slinton |
18916607Ssam     FUNC opt_qual_symbol
1909683Slinton {
1919683Slinton 	$$ = build(O_FUNC, $2);
1929683Slinton }
1939683Slinton |
1949683Slinton     GRIPE
1959683Slinton {
1969683Slinton 	$$ = build(O_GRIPE);
1979683Slinton }
1989683Slinton |
1999683Slinton     HELP
2009683Slinton {
2019683Slinton 	$$ = build(O_HELP);
2029683Slinton }
2039683Slinton |
2049683Slinton     IGNORE INT
2059683Slinton {
2069683Slinton 	$$ = build(O_IGNORE, $2);
2079683Slinton }
2089683Slinton |
2099683Slinton     list_command
2109683Slinton {
2119683Slinton 	$$ = $1;
2129683Slinton }
2139683Slinton |
2149683Slinton     PSYM term
2159683Slinton {
2169683Slinton 	$$ = build(O_PSYM, $2);
2179683Slinton }
2189683Slinton |
2199683Slinton     QUIT
2209683Slinton {
2219683Slinton 	if (not popinput()) {
2229683Slinton 	    quit(0);
2239683Slinton 	} else {
2249683Slinton 	    $$ = nil;
2259683Slinton 	}
2269683Slinton }
2279683Slinton |
22816607Ssam     RETURN
22916607Ssam {
23016607Ssam 	$$ = build(O_RETURN, nil);
23116607Ssam }
23216607Ssam |
23316607Ssam     RETURN opt_qual_symbol
23416607Ssam {
23516607Ssam 	$$ = build(O_RETURN, $2);
23616607Ssam }
23716607Ssam |
2389683Slinton     runcommand
2399683Slinton {
2409683Slinton 	run();
2419683Slinton 	/* NOTREACHED */
2429683Slinton }
2439683Slinton |
2449683Slinton     SH
2459683Slinton {
2469683Slinton 	shellline();
2479683Slinton 	$$ = nil;
2489683Slinton }
2499683Slinton |
2509683Slinton     SOURCE shellmode filename
2519683Slinton {
2529683Slinton 	$$ = build(O_SOURCE, $3);
2539683Slinton }
2549683Slinton |
2559683Slinton     step
2569683Slinton {
2579683Slinton 	$$ = $1;
2589683Slinton }
2599683Slinton |
2609683Slinton     stop where opt_cond
2619683Slinton {
2629683Slinton 	$$ = build($1, nil, $2, $3);
2639683Slinton }
2649683Slinton |
2659683Slinton     stop what opt_cond
2669683Slinton {
2679683Slinton 	$$ = build($1, $2, nil, $3);
2689683Slinton }
2699683Slinton |
2709683Slinton     stop IF boolean_exp
2719683Slinton {
2729683Slinton 	$$ = build($1, nil, nil, $3);
2739683Slinton }
2749683Slinton |
2759683Slinton     trace what where opt_cond
2769683Slinton {
2779683Slinton 	$$ = build($1, $2, $3, $4);
2789683Slinton }
2799683Slinton |
2809683Slinton     trace where opt_cond
2819683Slinton {
2829683Slinton 	$$ = build($1, nil, $2, $3);
2839683Slinton }
2849683Slinton |
2859683Slinton     trace what opt_cond
2869683Slinton {
2879683Slinton 	$$ = build($1, $2, nil, $3);
2889683Slinton }
2899683Slinton |
2909683Slinton     trace opt_cond
2919683Slinton {
2929683Slinton 	$$ = build($1, nil, nil, $2);
2939683Slinton }
2949683Slinton |
29516607Ssam     UP
2969683Slinton {
29716607Ssam 	$$ = build(O_UP, build(O_LCON, (long) 1));
2989683Slinton }
2999683Slinton |
30016607Ssam     UP INT
3019683Slinton {
30216607Ssam 	$$ = build(O_UP, build(O_LCON, (long) $2));
3039683Slinton }
3049683Slinton |
3059683Slinton     USE shellmode sourcepath
3069683Slinton {
30714673Slinton 	String dir;
30814673Slinton 
3099683Slinton 	$$ = nil;
31014673Slinton 	if (list_size($3) == 0) {
31114673Slinton 	    foreach (String, dir, sourcepath)
31214673Slinton 		printf("%s ", dir);
31314673Slinton 	    endfor
31414673Slinton 	    printf("\n");
31514673Slinton 	} else {
31614673Slinton 	    foreach (String, dir, sourcepath)
31714673Slinton 		list_delete(list_curitem(sourcepath), sourcepath);
31814673Slinton 	    endfor
31914673Slinton 	    sourcepath = $3;
3209683Slinton 	}
3219683Slinton }
32216604Ssam |
32316607Ssam     WHATIS term
32416604Ssam {
32516607Ssam 	$$ = build(O_WHATIS, $2);
32616604Ssam }
32716607Ssam |
32816607Ssam     WHEN event '{' actions '}'
32916604Ssam {
33016607Ssam 	$$ = build(O_ADDEVENT, $2, $4);
33116604Ssam }
33216604Ssam |
33316607Ssam     WHEREIS symbol
33416604Ssam {
33516607Ssam 	$$ = build(O_WHEREIS, $2);
33616604Ssam }
33716607Ssam |
33816607Ssam     WHICH symbol
33916604Ssam {
34016607Ssam 	$$ = build(O_WHICH, $2);
34116604Ssam }
342*16625Ssam |
343*16625Ssam     search_command
344*16625Ssam {
345*16625Ssam 	$$ = $1;
346*16625Ssam }
34716604Ssam ;
348*16625Ssam 
349*16625Ssam 
350*16625Ssam search_command:
351*16625Ssam     '/' pattern
352*16625Ssam {
353*16625Ssam 	$$ = build(O_SEARCH, build(O_LCON, 1), $2);
354*16625Ssam }
355*16625Ssam |
356*16625Ssam     '?' pattern
357*16625Ssam {
358*16625Ssam 	$$ = build(O_SEARCH, build(O_LCON, 0), $2);
359*16625Ssam }
360*16625Ssam ;
361*16625Ssam 
362*16625Ssam pattern:
363*16625Ssam     STRING
364*16625Ssam {
365*16625Ssam 	$$ = build(O_SCON, $1);
366*16625Ssam }
367*16625Ssam ;
368*16625Ssam 
3699683Slinton runcommand:
37016607Ssam     run arglist
37112482Slinton |
37212524Slinton     run
3739683Slinton ;
3749683Slinton run:
37512524Slinton     RUN shellmode
3769683Slinton {
37716607Ssam 	arginit();
3789683Slinton 	fflush(stdout);
3799683Slinton }
38016607Ssam |
38116607Ssam     RERUN shellmode
38216607Ssam {
38316607Ssam 	fflush(stdout);
38416607Ssam }
3859683Slinton ;
3869683Slinton arglist:
3879683Slinton     arglist arg
3889683Slinton |
38912482Slinton     arg
3909683Slinton ;
3919683Slinton arg:
3929683Slinton     NAME
3939683Slinton {
3949683Slinton 	newarg(ident($1));
3959683Slinton }
3969683Slinton |
39716607Ssam     STRING
39816607Ssam {
39916607Ssam 	newarg($1);
40016607Ssam }
40116607Ssam |
4029683Slinton     '<' NAME
4039683Slinton {
4049683Slinton 	inarg(ident($2));
4059683Slinton }
4069683Slinton |
4079683Slinton     '>' NAME
4089683Slinton {
4099683Slinton 	outarg(ident($2));
4109683Slinton }
4119683Slinton ;
4129683Slinton step:
4139683Slinton     STEP
4149683Slinton {
4159683Slinton 	$$ = build(O_STEP, true, false);
4169683Slinton }
4179683Slinton |
4189683Slinton     STEPI
4199683Slinton {
4209683Slinton 	$$ = build(O_STEP, false, false);
4219683Slinton }
4229683Slinton |
4239683Slinton     NEXT
4249683Slinton {
4259683Slinton 	$$ = build(O_STEP, true, true);
4269683Slinton }
4279683Slinton |
4289683Slinton     NEXTI
4299683Slinton {
4309683Slinton 	$$ = build(O_STEP, false, true);
4319683Slinton }
4329683Slinton ;
4339683Slinton shellmode:
4349683Slinton     /* empty */
4359683Slinton {
4369683Slinton 	beginshellmode();
4379683Slinton }
4389683Slinton ;
4399683Slinton sourcepath:
4409683Slinton     sourcepath NAME
4419683Slinton {
44214673Slinton 	$$ = $1;
44314673Slinton 	list_append(list_item(ident($2)), nil, $$);
4449683Slinton }
4459683Slinton |
4469683Slinton     /* empty */
4479683Slinton {
44814673Slinton 	$$ = list_alloc();
4499683Slinton }
4509683Slinton ;
4519683Slinton event:
4529683Slinton     where
4539683Slinton |
4549683Slinton     exp
4559683Slinton ;
4569683Slinton actions:
4579683Slinton     actions cmd ';'
4589683Slinton {
4599683Slinton 	$$ = $1;
4609683Slinton 	cmdlist_append($2, $$);
4619683Slinton }
4629683Slinton |
4639683Slinton     cmd ';'
4649683Slinton {
4659683Slinton 	$$ = list_alloc();
4669683Slinton 	cmdlist_append($1, $$);
4679683Slinton }
4689683Slinton ;
4699683Slinton cmd:
4709683Slinton     command
4719683Slinton |
4729683Slinton     rcommand
4739683Slinton ;
4749683Slinton 
4759683Slinton /*
4769683Slinton  * Redirectable commands.
4779683Slinton  */
4789683Slinton rcommand:
4799683Slinton     PRINT exp_list
4809683Slinton {
4819683Slinton 	$$ = build(O_PRINT, $2);
4829683Slinton }
4839683Slinton |
4849683Slinton     WHERE
4859683Slinton {
4869683Slinton 	$$ = build(O_WHERE);
4879683Slinton }
4889683Slinton |
4899683Slinton     examine
4909683Slinton {
4919683Slinton 	$$ = $1;
4929683Slinton }
4939683Slinton |
49416607Ssam     CALL term '(' opt_exp_list ')'
4959683Slinton {
49616607Ssam 	$$ = build(O_CALL, $2, $4);
4979683Slinton }
4989683Slinton |
49912536Scsvaf     DEBUG INT
50012536Scsvaf {
50112536Scsvaf  	$$ = build(O_DEBUG, $2);
50212536Scsvaf }
50312536Scsvaf |
5049683Slinton     DUMP
5059683Slinton {
5069683Slinton 	$$ = build(O_DUMP);
5079683Slinton }
5089683Slinton |
5099683Slinton     STATUS
5109683Slinton {
5119683Slinton 	$$ = build(O_STATUS);
5129683Slinton }
5139683Slinton ;
5149683Slinton alias_command:
5159683Slinton     ALIAS name name
5169683Slinton {
5179683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
5189683Slinton }
5199683Slinton |
5209683Slinton     ALIAS name
5219683Slinton {
5229683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
5239683Slinton }
5249683Slinton |
5259683Slinton     ALIAS
5269683Slinton {
5279683Slinton 	$$ = build(O_ALIAS, nil, nil);
5289683Slinton }
5299683Slinton ;
5309683Slinton trace:
5319683Slinton     TRACE
5329683Slinton {
5339683Slinton 	$$ = O_TRACE;
5349683Slinton }
5359683Slinton |
5369683Slinton     TRACEI
5379683Slinton {
5389683Slinton 	$$ = O_TRACEI;
5399683Slinton }
5409683Slinton ;
5419683Slinton stop:
5429683Slinton     STOP
5439683Slinton {
5449683Slinton 	$$ = O_STOP;
5459683Slinton }
5469683Slinton |
5479683Slinton     STOPI
5489683Slinton {
5499683Slinton 	$$ = O_STOPI;
5509683Slinton }
5519683Slinton ;
5529683Slinton what:
5539683Slinton     exp
5549683Slinton {
5559683Slinton 	$$ = $1;
5569683Slinton }
5579683Slinton |
5589683Slinton     STRING ':' line_number
5599683Slinton {
5609683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
5619683Slinton }
5629683Slinton ;
5639683Slinton where:
5649683Slinton     IN term
5659683Slinton {
5669683Slinton 	$$ = $2;
5679683Slinton }
5689683Slinton |
5699683Slinton     AT line_number
5709683Slinton {
5719683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
5729683Slinton }
5739683Slinton |
5749683Slinton     AT STRING ':' line_number
5759683Slinton {
5769683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
5779683Slinton }
5789683Slinton ;
5799683Slinton filename:
5809683Slinton     NAME
5819683Slinton {
5829683Slinton 	$$ = ident($1);
5839683Slinton }
5849683Slinton ;
5859683Slinton opt_filename:
5869683Slinton     /* empty */
5879683Slinton {
5889683Slinton 	$$ = nil;
5899683Slinton }
5909683Slinton |
5919683Slinton     filename
5929683Slinton {
5939683Slinton 	$$ = $1;
5949683Slinton }
5959683Slinton ;
59612482Slinton opt_exp_list:
59712482Slinton     exp_list
5989683Slinton {
59912482Slinton 	$$ = $1;
6009683Slinton }
6019683Slinton |
60212482Slinton     /* empty */
6039683Slinton {
60412482Slinton 	$$ = nil;
6059683Slinton }
6069683Slinton ;
6079683Slinton list_command:
6089683Slinton     LIST
6099683Slinton {
6109683Slinton 	$$ = build(O_LIST,
6119683Slinton 	    build(O_LCON, (long) cursrcline),
6129683Slinton 	    build(O_LCON, (long) cursrcline + 9)
6139683Slinton 	);
6149683Slinton }
6159683Slinton |
6169683Slinton     LIST line_number
6179683Slinton {
6189683Slinton 	$$ = build(O_LIST, $2, $2);
6199683Slinton }
6209683Slinton |
6219683Slinton     LIST line_number ',' line_number
6229683Slinton {
6239683Slinton 	$$ = build(O_LIST, $2, $4);
6249683Slinton }
6259683Slinton |
62616607Ssam     LIST opt_qual_symbol
6279683Slinton {
6289683Slinton 	$$ = build(O_LIST, $2);
6299683Slinton }
6309683Slinton ;
63116607Ssam integer_list:
63216607Ssam     INT
63316607Ssam {
63416607Ssam 	$$ = build(O_LCON, $1);
63516607Ssam }
63616607Ssam |
63716607Ssam     INT integer_list
63816607Ssam {
63916607Ssam 	$$ = build(O_COMMA, build(O_LCON, $1), $2);
64016607Ssam }
64116607Ssam ;
6429683Slinton line_number:
6439683Slinton     INT
6449683Slinton {
6459683Slinton 	$$ = build(O_LCON, $1);
6469683Slinton }
6479683Slinton |
6489683Slinton     '$'
6499683Slinton {
6509683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
6519683Slinton }
6529683Slinton ;
6539683Slinton examine:
6549683Slinton     address '/' count mode
6559683Slinton {
6569683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
6579683Slinton }
6589683Slinton |
6599683Slinton     address ',' address '/' mode
6609683Slinton {
6619683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
6629683Slinton }
6639683Slinton |
6649683Slinton     '/' count mode
6659683Slinton {
6669683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
6679683Slinton }
66811173Slinton |
66911173Slinton     address '=' mode
67011173Slinton {
67111173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
67211173Slinton }
6739683Slinton ;
6749683Slinton address:
6759683Slinton     INT
6769683Slinton {
6779683Slinton 	$$ = build(O_LCON, $1);
6789683Slinton }
6799683Slinton |
6809683Slinton     '&' term
6819683Slinton {
6829683Slinton 	$$ = amper($2);
6839683Slinton }
6849683Slinton |
6859683Slinton     address '+' address
6869683Slinton {
6879683Slinton 	$$ = build(O_ADD, $1, $3);
6889683Slinton }
6899683Slinton |
6909683Slinton     address '-' address
6919683Slinton {
6929683Slinton 	$$ = build(O_SUB, $1, $3);
6939683Slinton }
6949683Slinton |
6959683Slinton     address '*' address
6969683Slinton {
6979683Slinton 	$$ = build(O_MUL, $1, $3);
6989683Slinton }
6999683Slinton |
7009683Slinton     '*' address %prec UNARYSIGN
7019683Slinton {
7029683Slinton 	$$ = build(O_INDIR, $2);
7039683Slinton }
7049683Slinton |
7059683Slinton     '(' exp ')'
7069683Slinton {
7079683Slinton 	$$ = $2;
7089683Slinton }
7099683Slinton ;
7109683Slinton count:
7119683Slinton     /* empty */
7129683Slinton {
7139683Slinton 	$$ = 1;
7149683Slinton }
7159683Slinton |
7169683Slinton     INT
7179683Slinton {
7189683Slinton 	$$ = $1;
7199683Slinton }
7209683Slinton ;
7219683Slinton mode:
7229683Slinton     name
7239683Slinton {
7249683Slinton 	$$ = ident($1);
7259683Slinton 	curformat = $$;
7269683Slinton }
7279683Slinton |
7289683Slinton     /* empty */
7299683Slinton {
7309683Slinton 	$$ = curformat;
7319683Slinton }
7329683Slinton ;
7339683Slinton opt_cond:
7349683Slinton     /* empty */
7359683Slinton {
7369683Slinton 	$$ = nil;
7379683Slinton }
7389683Slinton |
7399683Slinton     IF boolean_exp
7409683Slinton {
7419683Slinton 	$$ = $2;
7429683Slinton }
7439683Slinton ;
7449683Slinton exp_list:
7459683Slinton     exp
7469683Slinton {
7479683Slinton 	$$ = build(O_COMMA, $1, nil);
7489683Slinton }
7499683Slinton |
7509683Slinton     exp ',' exp_list
7519683Slinton {
7529683Slinton 	$$ = build(O_COMMA, $1, $3);
7539683Slinton }
7549683Slinton ;
7559683Slinton exp:
7569683Slinton     term
7579683Slinton {
7589683Slinton 	$$ = build(O_RVAL, $1);
7599683Slinton }
7609683Slinton |
7619683Slinton     constant
7629683Slinton {
7639683Slinton 	$$ = $1;
7649683Slinton }
7659683Slinton |
76616607Ssam     exp '\\' opt_qual_symbol
76711173Slinton {
76811173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
76911173Slinton }
77011173Slinton |
7719683Slinton     '+' exp %prec UNARYSIGN
7729683Slinton {
7739683Slinton 	$$ = $2;
7749683Slinton }
7759683Slinton |
7769683Slinton     '-' exp %prec UNARYSIGN
7779683Slinton {
7789683Slinton 	$$ = build(O_NEG, $2);
7799683Slinton }
7809683Slinton |
7819683Slinton     '&' exp %prec UNARYSIGN
7829683Slinton {
7839683Slinton 	$$ = amper($2);
7849683Slinton }
7859683Slinton |
7869683Slinton     exp '+' exp
7879683Slinton {
7889683Slinton 	$$ = build(O_ADD, $1, $3);
7899683Slinton }
7909683Slinton |
7919683Slinton     exp '-' exp
7929683Slinton {
7939683Slinton 	$$ = build(O_SUB, $1, $3);
7949683Slinton }
7959683Slinton |
7969683Slinton     exp '*' exp
7979683Slinton {
7989683Slinton 	$$ = build(O_MUL, $1, $3);
7999683Slinton }
8009683Slinton |
8019683Slinton     exp '/' exp
8029683Slinton {
8039683Slinton 	$$ = build(O_DIVF, $1, $3);
8049683Slinton }
8059683Slinton |
8069683Slinton     exp DIV exp
8079683Slinton {
8089683Slinton 	$$ = build(O_DIV, $1, $3);
8099683Slinton }
8109683Slinton |
8119683Slinton     exp MOD exp
8129683Slinton {
8139683Slinton 	$$ = build(O_MOD, $1, $3);
8149683Slinton }
8159683Slinton |
8169683Slinton     exp AND exp
8179683Slinton {
8189683Slinton 	$$ = build(O_AND, $1, $3);
8199683Slinton }
8209683Slinton |
8219683Slinton     exp OR exp
8229683Slinton {
8239683Slinton 	$$ = build(O_OR, $1, $3);
8249683Slinton }
8259683Slinton |
8269683Slinton     exp '<' exp
8279683Slinton {
8289683Slinton 	$$ = build(O_LT, $1, $3);
8299683Slinton }
8309683Slinton |
8319683Slinton     exp '<' '=' exp
8329683Slinton {
8339683Slinton 	$$ = build(O_LE, $1, $4);
8349683Slinton }
8359683Slinton |
8369683Slinton     exp '>' exp
8379683Slinton {
8389683Slinton 	$$ = build(O_GT, $1, $3);
8399683Slinton }
8409683Slinton |
8419683Slinton     exp '>' '=' exp
8429683Slinton {
8439683Slinton 	$$ = build(O_GE, $1, $4);
8449683Slinton }
8459683Slinton |
8469683Slinton     exp '=' exp
8479683Slinton {
8489683Slinton 	$$ = build(O_EQ, $1, $3);
8499683Slinton }
8509683Slinton |
8519683Slinton     exp '=' '=' exp
8529683Slinton {
8539683Slinton 	$$ = build(O_EQ, $1, $4);
8549683Slinton }
8559683Slinton |
8569683Slinton     exp '<' '>' exp
8579683Slinton {
8589683Slinton 	$$ = build(O_NE, $1, $4);
8599683Slinton }
8609683Slinton |
8619683Slinton     exp '!' '=' exp
8629683Slinton {
8639683Slinton 	$$ = build(O_NE, $1, $4);
8649683Slinton }
8659683Slinton |
8669683Slinton     '(' exp ')'
8679683Slinton {
8689683Slinton 	$$ = $2;
8699683Slinton }
8709683Slinton ;
8719683Slinton term:
8729683Slinton     symbol
8739683Slinton {
8749683Slinton 	$$ = $1;
8759683Slinton }
8769683Slinton |
8779683Slinton     term '[' exp_list ']'
8789683Slinton {
8799683Slinton 	$$ = subscript($1, $3);
8809683Slinton }
8819683Slinton |
8829683Slinton     term '.' name
8839683Slinton {
8849683Slinton 	$$ = dot($1, $3);
8859683Slinton }
8869683Slinton |
8879683Slinton     term ARROW name
8889683Slinton {
8899683Slinton 	$$ = dot($1, $3);
8909683Slinton }
8919683Slinton |
8929683Slinton     '*' term %prec UNARYSIGN
8939683Slinton {
8949683Slinton 	$$ = build(O_INDIR, $2);
8959683Slinton }
8969683Slinton |
8979683Slinton     '*' '(' exp ')' %prec UNARYSIGN
8989683Slinton {
8999683Slinton 	$$ = build(O_INDIR, $3);
9009683Slinton }
9019683Slinton |
9029683Slinton     term '^' %prec UNARYSIGN
9039683Slinton {
9049683Slinton 	$$ = build(O_INDIR, $1);
9059683Slinton }
9069683Slinton |
9079683Slinton     '#' term %prec UNARYSIGN
9089683Slinton {
9099683Slinton 	$$ = concrete($2);
9109683Slinton }
9119683Slinton |
91216607Ssam     '#' '(' exp ')' %prec UNARYSIGN
91316607Ssam {
91416607Ssam 	$$ = concrete($3);
91516607Ssam }
91616607Ssam |
91712482Slinton     term '(' opt_exp_list ')'
9189683Slinton {
9199683Slinton 	$$ = build(O_CALL, $1, $3);
9209683Slinton }
9219683Slinton ;
9229683Slinton boolean_exp:
9239683Slinton     exp
9249683Slinton {
9259683Slinton 	chkboolean($1);
9269683Slinton 	$$ = $1;
9279683Slinton }
9289683Slinton ;
9299683Slinton constant:
9309683Slinton     INT
9319683Slinton {
9329683Slinton 	$$ = build(O_LCON, $1);
9339683Slinton }
9349683Slinton |
9359683Slinton     REAL
9369683Slinton {
9379683Slinton 	$$ = build(O_FCON, $1);
9389683Slinton }
9399683Slinton |
9409683Slinton     STRING
9419683Slinton {
9429683Slinton 	$$ = build(O_SCON, $1);
9439683Slinton }
9449683Slinton ;
94516607Ssam opt_qual_symbol:
94616607Ssam     symbol
94716607Ssam {
94816607Ssam 	$$ = $1;
94916607Ssam }
95016607Ssam |
95116607Ssam     opt_qual_symbol '.' name
95216607Ssam {
95316607Ssam 	$$ = dot($1, $3);
95416607Ssam }
95516607Ssam ;
9569683Slinton symbol:
9579683Slinton     name
9589683Slinton {
9599683Slinton 	$$ = build(O_SYM, which($1));
9609683Slinton }
96116607Ssam |
96216607Ssam     '.' name
96316607Ssam {
96416607Ssam 	$$ = dot(build(O_SYM, program), $2);
96516607Ssam }
9669683Slinton ;
9679683Slinton name:
9689683Slinton     NAME
9699683Slinton {
9709683Slinton 	$$ = $1;
9719683Slinton }
9729683Slinton |
9739683Slinton     keyword
9749683Slinton {
9759683Slinton 	$$ = $1;
9769683Slinton }
9779683Slinton keyword:
97812536Scsvaf     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV |
97916607Ssam     DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST |
98016607Ssam     MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT |
98116607Ssam     RERUN | RETURN | RUN | SH | SKIP | SOURCE | STATUS | STEP | STEPI |
98216607Ssam     STOP | STOPI | TRACE | TRACEI | UP |
98313840Slinton     USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH
9849683Slinton ;
985