xref: /csrg-svn/old/dbx/commands.y (revision 16604)
19683Slinton %{
29683Slinton 
39683Slinton /* Copyright (c) 1982 Regents of the University of California */
49683Slinton 
5*16604Ssam static char sccsid[] = "@(#)commands.y 1.10 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
2612536Scsvaf     ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP
279683Slinton     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
289683Slinton     PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
299683Slinton     STOP STOPI TRACE TRACEI
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
6212536Scsvaf %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP
639683Slinton %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
649683Slinton %type <y_name>	    NEXT NEXTI NIL NOT OR
659683Slinton %type <y_name>	    PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
669683Slinton %type <y_name>	    STOP STOPI TRACE TRACEI
679683Slinton %type <y_name>	    USE WHATIS WHEN WHERE WHEREIS WHICH
689683Slinton %type <y_name>	    name NAME keyword
699683Slinton %type <y_node>      symbol
709683Slinton %type <y_node>	    command rcommand cmd step what where examine
7112482Slinton %type <y_node>	    event opt_exp_list opt_cond
729683Slinton %type <y_node>	    exp_list exp term boolean_exp constant address
739683Slinton %type <y_node>	    alias_command list_command line_number
74*16604Ssam %type <y_node>	    search_command pattern
759683Slinton %type <y_cmdlist>   actions
7614673Slinton %type <y_list>      sourcepath
779683Slinton 
789683Slinton %%
799683Slinton 
809683Slinton input:
819683Slinton     input command_nl
829683Slinton |
839683Slinton     /* empty */
849683Slinton ;
859683Slinton command_nl:
869683Slinton     command_line '\n'
879683Slinton |
889683Slinton     command_line ';'
899683Slinton |
909683Slinton     '\n'
919683Slinton ;
929683Slinton 
939683Slinton command_line:
949683Slinton     command
959683Slinton {
969683Slinton 	if ($1 != nil) {
9712536Scsvaf             if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
989683Slinton 	    eval($1);
999683Slinton 	}
1009683Slinton }
1019683Slinton |
1029683Slinton     rcommand redirectout
1039683Slinton {
1049683Slinton 	if ($1 != nil) {
1059683Slinton 	    if ($2 != nil) {
1069683Slinton 		setout($2);
10712536Scsvaf                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
1089683Slinton 		eval($1);
1099683Slinton 		unsetout();
1109683Slinton 	    } else {
11112536Scsvaf                 if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);}
1129683Slinton 		eval($1);
1139683Slinton 	    }
1149683Slinton 	}
1159683Slinton }
1169683Slinton ;
1179683Slinton redirectout:
1189683Slinton     '>' shellmode NAME
1199683Slinton {
1209683Slinton 	$$ = ident($3);
1219683Slinton }
1229683Slinton |
1239683Slinton     /* empty */
1249683Slinton {
1259683Slinton 	$$ = nil;
1269683Slinton }
1279683Slinton ;
1289683Slinton 
1299683Slinton /*
1309683Slinton  * Non-redirectable commands.
1319683Slinton  */
1329683Slinton command:
1339683Slinton     alias_command
1349683Slinton {
1359683Slinton 	$$ = $1;
1369683Slinton }
1379683Slinton |
1389683Slinton     ASSIGN term '=' exp
1399683Slinton {
1409683Slinton 	$$ = build(O_ASSIGN, $2, $4);
1419683Slinton }
1429683Slinton |
1439683Slinton     CATCH INT
1449683Slinton {
1459683Slinton 	$$ = build(O_CATCH, $2);
1469683Slinton }
1479683Slinton |
1489683Slinton     CONT
1499683Slinton {
15014673Slinton 	$$ = build(O_CONT, (long) DEFSIG);
1519683Slinton }
1529683Slinton |
15311870Slinton     CONT INT
15411870Slinton {
15511870Slinton 	$$ = build(O_CONT, $2);
15611870Slinton }
15711870Slinton |
1589683Slinton     DELETE INT
1599683Slinton {
1609683Slinton 	$$ = build(O_DELETE, $2);
1619683Slinton }
1629683Slinton |
1639683Slinton     EDIT shellmode opt_filename
1649683Slinton {
1659683Slinton 	$$ = build(O_EDIT, $3);
1669683Slinton }
1679683Slinton |
1689683Slinton     FILE shellmode opt_filename
1699683Slinton {
1709683Slinton 	$$ = build(O_CHFILE, $3);
1719683Slinton }
1729683Slinton |
1739683Slinton     FUNC
1749683Slinton {
1759683Slinton 	$$ = build(O_FUNC, nil);
1769683Slinton }
1779683Slinton |
1789683Slinton     FUNC symbol
1799683Slinton {
1809683Slinton 	$$ = build(O_FUNC, $2);
1819683Slinton }
1829683Slinton |
1839683Slinton     GRIPE
1849683Slinton {
1859683Slinton 	$$ = build(O_GRIPE);
1869683Slinton }
1879683Slinton |
1889683Slinton     HELP
1899683Slinton {
1909683Slinton 	$$ = build(O_HELP);
1919683Slinton }
1929683Slinton |
1939683Slinton     IGNORE INT
1949683Slinton {
1959683Slinton 	$$ = build(O_IGNORE, $2);
1969683Slinton }
1979683Slinton |
1989683Slinton     list_command
1999683Slinton {
2009683Slinton 	$$ = $1;
2019683Slinton }
2029683Slinton |
2039683Slinton     PSYM term
2049683Slinton {
2059683Slinton 	$$ = build(O_PSYM, $2);
2069683Slinton }
2079683Slinton |
2089683Slinton     QUIT
2099683Slinton {
2109683Slinton 	if (not popinput()) {
2119683Slinton 	    quit(0);
2129683Slinton 	} else {
2139683Slinton 	    $$ = nil;
2149683Slinton 	}
2159683Slinton }
2169683Slinton |
2179683Slinton     runcommand
2189683Slinton {
2199683Slinton 	run();
2209683Slinton 	/* NOTREACHED */
2219683Slinton }
2229683Slinton |
2239683Slinton     SH
2249683Slinton {
2259683Slinton 	shellline();
2269683Slinton 	$$ = nil;
2279683Slinton }
2289683Slinton |
2299683Slinton     SOURCE shellmode filename
2309683Slinton {
2319683Slinton 	$$ = build(O_SOURCE, $3);
2329683Slinton }
2339683Slinton |
2349683Slinton     step
2359683Slinton {
2369683Slinton 	$$ = $1;
2379683Slinton }
2389683Slinton |
2399683Slinton     stop where opt_cond
2409683Slinton {
2419683Slinton 	$$ = build($1, nil, $2, $3);
2429683Slinton }
2439683Slinton |
2449683Slinton     stop what opt_cond
2459683Slinton {
2469683Slinton 	$$ = build($1, $2, nil, $3);
2479683Slinton }
2489683Slinton |
2499683Slinton     stop IF boolean_exp
2509683Slinton {
2519683Slinton 	$$ = build($1, nil, nil, $3);
2529683Slinton }
2539683Slinton |
2549683Slinton     trace what where opt_cond
2559683Slinton {
2569683Slinton 	$$ = build($1, $2, $3, $4);
2579683Slinton }
2589683Slinton |
2599683Slinton     trace where opt_cond
2609683Slinton {
2619683Slinton 	$$ = build($1, nil, $2, $3);
2629683Slinton }
2639683Slinton |
2649683Slinton     trace what opt_cond
2659683Slinton {
2669683Slinton 	$$ = build($1, $2, nil, $3);
2679683Slinton }
2689683Slinton |
2699683Slinton     trace opt_cond
2709683Slinton {
2719683Slinton 	$$ = build($1, nil, nil, $2);
2729683Slinton }
2739683Slinton |
2749683Slinton     WHATIS term
2759683Slinton {
2769683Slinton 	$$ = build(O_WHATIS, $2);
2779683Slinton }
2789683Slinton |
2799683Slinton     WHEN event '{' actions '}'
2809683Slinton {
2819683Slinton 	$$ = build(O_ADDEVENT, $2, $4);
2829683Slinton }
2839683Slinton |
2849683Slinton     WHEREIS symbol
2859683Slinton {
2869683Slinton 	$$ = build(O_WHEREIS, $2);
2879683Slinton }
2889683Slinton |
2899683Slinton     WHICH symbol
2909683Slinton {
2919683Slinton 	$$ = build(O_WHICH, $2);
2929683Slinton }
2939683Slinton |
2949683Slinton     USE shellmode sourcepath
2959683Slinton {
29614673Slinton 	String dir;
29714673Slinton 
2989683Slinton 	$$ = nil;
29914673Slinton 	if (list_size($3) == 0) {
30014673Slinton 	    foreach (String, dir, sourcepath)
30114673Slinton 		printf("%s ", dir);
30214673Slinton 	    endfor
30314673Slinton 	    printf("\n");
30414673Slinton 	} else {
30514673Slinton 	    foreach (String, dir, sourcepath)
30614673Slinton 		list_delete(list_curitem(sourcepath), sourcepath);
30714673Slinton 	    endfor
30814673Slinton 	    sourcepath = $3;
3099683Slinton 	}
3109683Slinton }
311*16604Ssam |
312*16604Ssam     search_command
313*16604Ssam {
314*16604Ssam 	$$ = $1;
315*16604Ssam }
3169683Slinton ;
317*16604Ssam 
318*16604Ssam 
319*16604Ssam search_command:
320*16604Ssam     '/' pattern
321*16604Ssam {
322*16604Ssam 	$$ = build(O_SEARCH, build(O_LCON, 1), $2);
323*16604Ssam }
324*16604Ssam |
325*16604Ssam     '?' pattern
326*16604Ssam {
327*16604Ssam 	$$ = build(O_SEARCH, build(O_LCON, 0), $2);
328*16604Ssam }
329*16604Ssam ;
330*16604Ssam 
331*16604Ssam pattern:
332*16604Ssam     STRING
333*16604Ssam {
334*16604Ssam 	$$ = build(O_SCON, $1);
335*16604Ssam }
336*16604Ssam ;
337*16604Ssam 
3389683Slinton runcommand:
33912524Slinton     run { arginit(); } arglist
34012482Slinton |
34112524Slinton     run
3429683Slinton ;
3439683Slinton run:
34412524Slinton     RUN shellmode
3459683Slinton {
3469683Slinton 	fflush(stdout);
3479683Slinton }
3489683Slinton ;
3499683Slinton arglist:
3509683Slinton     arglist arg
3519683Slinton |
35212482Slinton     arg
3539683Slinton ;
3549683Slinton arg:
3559683Slinton     NAME
3569683Slinton {
3579683Slinton 	newarg(ident($1));
3589683Slinton }
3599683Slinton |
3609683Slinton     '<' NAME
3619683Slinton {
3629683Slinton 	inarg(ident($2));
3639683Slinton }
3649683Slinton |
3659683Slinton     '>' NAME
3669683Slinton {
3679683Slinton 	outarg(ident($2));
3689683Slinton }
3699683Slinton ;
3709683Slinton step:
3719683Slinton     STEP
3729683Slinton {
3739683Slinton 	$$ = build(O_STEP, true, false);
3749683Slinton }
3759683Slinton |
3769683Slinton     STEPI
3779683Slinton {
3789683Slinton 	$$ = build(O_STEP, false, false);
3799683Slinton }
3809683Slinton |
3819683Slinton     NEXT
3829683Slinton {
3839683Slinton 	$$ = build(O_STEP, true, true);
3849683Slinton }
3859683Slinton |
3869683Slinton     NEXTI
3879683Slinton {
3889683Slinton 	$$ = build(O_STEP, false, true);
3899683Slinton }
3909683Slinton ;
3919683Slinton shellmode:
3929683Slinton     /* empty */
3939683Slinton {
3949683Slinton 	beginshellmode();
3959683Slinton }
3969683Slinton ;
3979683Slinton sourcepath:
3989683Slinton     sourcepath NAME
3999683Slinton {
40014673Slinton 	$$ = $1;
40114673Slinton 	list_append(list_item(ident($2)), nil, $$);
4029683Slinton }
4039683Slinton |
4049683Slinton     /* empty */
4059683Slinton {
40614673Slinton 	$$ = list_alloc();
4079683Slinton }
4089683Slinton ;
4099683Slinton event:
4109683Slinton     where
4119683Slinton |
4129683Slinton     exp
4139683Slinton ;
4149683Slinton actions:
4159683Slinton     actions cmd ';'
4169683Slinton {
4179683Slinton 	$$ = $1;
4189683Slinton 	cmdlist_append($2, $$);
4199683Slinton }
4209683Slinton |
4219683Slinton     cmd ';'
4229683Slinton {
4239683Slinton 	$$ = list_alloc();
4249683Slinton 	cmdlist_append($1, $$);
4259683Slinton }
4269683Slinton ;
4279683Slinton cmd:
4289683Slinton     command
4299683Slinton |
4309683Slinton     rcommand
4319683Slinton ;
4329683Slinton 
4339683Slinton /*
4349683Slinton  * Redirectable commands.
4359683Slinton  */
4369683Slinton rcommand:
4379683Slinton     PRINT exp_list
4389683Slinton {
4399683Slinton 	$$ = build(O_PRINT, $2);
4409683Slinton }
4419683Slinton |
4429683Slinton     WHERE
4439683Slinton {
4449683Slinton 	$$ = build(O_WHERE);
4459683Slinton }
4469683Slinton |
4479683Slinton     examine
4489683Slinton {
4499683Slinton 	$$ = $1;
4509683Slinton }
4519683Slinton |
4529683Slinton     CALL term
4539683Slinton {
4549683Slinton 	$$ = $2;
4559683Slinton }
4569683Slinton |
45712536Scsvaf     DEBUG INT
45812536Scsvaf {
45912536Scsvaf  	$$ = build(O_DEBUG, $2);
46012536Scsvaf }
46112536Scsvaf |
4629683Slinton     DUMP
4639683Slinton {
4649683Slinton 	$$ = build(O_DUMP);
4659683Slinton }
4669683Slinton |
4679683Slinton     STATUS
4689683Slinton {
4699683Slinton 	$$ = build(O_STATUS);
4709683Slinton }
4719683Slinton ;
4729683Slinton alias_command:
4739683Slinton     ALIAS name name
4749683Slinton {
4759683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
4769683Slinton }
4779683Slinton |
4789683Slinton     ALIAS name
4799683Slinton {
4809683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
4819683Slinton }
4829683Slinton |
4839683Slinton     ALIAS
4849683Slinton {
4859683Slinton 	$$ = build(O_ALIAS, nil, nil);
4869683Slinton }
4879683Slinton ;
4889683Slinton trace:
4899683Slinton     TRACE
4909683Slinton {
4919683Slinton 	$$ = O_TRACE;
4929683Slinton }
4939683Slinton |
4949683Slinton     TRACEI
4959683Slinton {
4969683Slinton 	$$ = O_TRACEI;
4979683Slinton }
4989683Slinton ;
4999683Slinton stop:
5009683Slinton     STOP
5019683Slinton {
5029683Slinton 	$$ = O_STOP;
5039683Slinton }
5049683Slinton |
5059683Slinton     STOPI
5069683Slinton {
5079683Slinton 	$$ = O_STOPI;
5089683Slinton }
5099683Slinton ;
5109683Slinton what:
5119683Slinton     exp
5129683Slinton {
5139683Slinton 	$$ = $1;
5149683Slinton }
5159683Slinton |
5169683Slinton     STRING ':' line_number
5179683Slinton {
5189683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
5199683Slinton }
5209683Slinton ;
5219683Slinton where:
5229683Slinton     IN term
5239683Slinton {
5249683Slinton 	$$ = $2;
5259683Slinton }
5269683Slinton |
5279683Slinton     AT line_number
5289683Slinton {
5299683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
5309683Slinton }
5319683Slinton |
5329683Slinton     AT STRING ':' line_number
5339683Slinton {
5349683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
5359683Slinton }
5369683Slinton ;
5379683Slinton filename:
5389683Slinton     NAME
5399683Slinton {
5409683Slinton 	$$ = ident($1);
5419683Slinton }
5429683Slinton ;
5439683Slinton opt_filename:
5449683Slinton     /* empty */
5459683Slinton {
5469683Slinton 	$$ = nil;
5479683Slinton }
5489683Slinton |
5499683Slinton     filename
5509683Slinton {
5519683Slinton 	$$ = $1;
5529683Slinton }
5539683Slinton ;
55412482Slinton opt_exp_list:
55512482Slinton     exp_list
5569683Slinton {
55712482Slinton 	$$ = $1;
5589683Slinton }
5599683Slinton |
56012482Slinton     /* empty */
5619683Slinton {
56212482Slinton 	$$ = nil;
5639683Slinton }
5649683Slinton ;
5659683Slinton list_command:
5669683Slinton     LIST
5679683Slinton {
5689683Slinton 	$$ = build(O_LIST,
5699683Slinton 	    build(O_LCON, (long) cursrcline),
5709683Slinton 	    build(O_LCON, (long) cursrcline + 9)
5719683Slinton 	);
5729683Slinton }
5739683Slinton |
5749683Slinton     LIST line_number
5759683Slinton {
5769683Slinton 	$$ = build(O_LIST, $2, $2);
5779683Slinton }
5789683Slinton |
5799683Slinton     LIST line_number ',' line_number
5809683Slinton {
5819683Slinton 	$$ = build(O_LIST, $2, $4);
5829683Slinton }
5839683Slinton |
5849683Slinton     LIST symbol
5859683Slinton {
5869683Slinton 	$$ = build(O_LIST, $2);
5879683Slinton }
5889683Slinton ;
5899683Slinton line_number:
5909683Slinton     INT
5919683Slinton {
5929683Slinton 	$$ = build(O_LCON, $1);
5939683Slinton }
5949683Slinton |
5959683Slinton     '$'
5969683Slinton {
5979683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
5989683Slinton }
5999683Slinton ;
6009683Slinton examine:
6019683Slinton     address '/' count mode
6029683Slinton {
6039683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
6049683Slinton }
6059683Slinton |
6069683Slinton     address ',' address '/' mode
6079683Slinton {
6089683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
6099683Slinton }
6109683Slinton |
6119683Slinton     '/' count mode
6129683Slinton {
6139683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
6149683Slinton }
61511173Slinton |
61611173Slinton     address '=' mode
61711173Slinton {
61811173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
61911173Slinton }
6209683Slinton ;
6219683Slinton address:
6229683Slinton     INT
6239683Slinton {
6249683Slinton 	$$ = build(O_LCON, $1);
6259683Slinton }
6269683Slinton |
6279683Slinton     '&' term
6289683Slinton {
6299683Slinton 	$$ = amper($2);
6309683Slinton }
6319683Slinton |
6329683Slinton     address '+' address
6339683Slinton {
6349683Slinton 	$$ = build(O_ADD, $1, $3);
6359683Slinton }
6369683Slinton |
6379683Slinton     address '-' address
6389683Slinton {
6399683Slinton 	$$ = build(O_SUB, $1, $3);
6409683Slinton }
6419683Slinton |
6429683Slinton     address '*' address
6439683Slinton {
6449683Slinton 	$$ = build(O_MUL, $1, $3);
6459683Slinton }
6469683Slinton |
6479683Slinton     '*' address %prec UNARYSIGN
6489683Slinton {
6499683Slinton 	$$ = build(O_INDIR, $2);
6509683Slinton }
6519683Slinton |
6529683Slinton     '(' exp ')'
6539683Slinton {
6549683Slinton 	$$ = $2;
6559683Slinton }
6569683Slinton ;
6579683Slinton count:
6589683Slinton     /* empty */
6599683Slinton {
6609683Slinton 	$$ = 1;
6619683Slinton }
6629683Slinton |
6639683Slinton     INT
6649683Slinton {
6659683Slinton 	$$ = $1;
6669683Slinton }
6679683Slinton ;
6689683Slinton mode:
6699683Slinton     name
6709683Slinton {
6719683Slinton 	$$ = ident($1);
6729683Slinton 	curformat = $$;
6739683Slinton }
6749683Slinton |
6759683Slinton     /* empty */
6769683Slinton {
6779683Slinton 	$$ = curformat;
6789683Slinton }
6799683Slinton ;
6809683Slinton opt_cond:
6819683Slinton     /* empty */
6829683Slinton {
6839683Slinton 	$$ = nil;
6849683Slinton }
6859683Slinton |
6869683Slinton     IF boolean_exp
6879683Slinton {
6889683Slinton 	$$ = $2;
6899683Slinton }
6909683Slinton ;
6919683Slinton exp_list:
6929683Slinton     exp
6939683Slinton {
6949683Slinton 	$$ = build(O_COMMA, $1, nil);
6959683Slinton }
6969683Slinton |
6979683Slinton     exp ',' exp_list
6989683Slinton {
6999683Slinton 	$$ = build(O_COMMA, $1, $3);
7009683Slinton }
7019683Slinton ;
7029683Slinton exp:
7039683Slinton     term
7049683Slinton {
7059683Slinton 	$$ = build(O_RVAL, $1);
7069683Slinton }
7079683Slinton |
7089683Slinton     constant
7099683Slinton {
7109683Slinton 	$$ = $1;
7119683Slinton }
7129683Slinton |
71311173Slinton     exp '\\' symbol
71411173Slinton {
71511173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
71611173Slinton }
71711173Slinton |
7189683Slinton     '+' exp %prec UNARYSIGN
7199683Slinton {
7209683Slinton 	$$ = $2;
7219683Slinton }
7229683Slinton |
7239683Slinton     '-' exp %prec UNARYSIGN
7249683Slinton {
7259683Slinton 	$$ = build(O_NEG, $2);
7269683Slinton }
7279683Slinton |
7289683Slinton     '&' exp %prec UNARYSIGN
7299683Slinton {
7309683Slinton 	$$ = amper($2);
7319683Slinton }
7329683Slinton |
7339683Slinton     exp '+' exp
7349683Slinton {
7359683Slinton 	$$ = build(O_ADD, $1, $3);
7369683Slinton }
7379683Slinton |
7389683Slinton     exp '-' exp
7399683Slinton {
7409683Slinton 	$$ = build(O_SUB, $1, $3);
7419683Slinton }
7429683Slinton |
7439683Slinton     exp '*' exp
7449683Slinton {
7459683Slinton 	$$ = build(O_MUL, $1, $3);
7469683Slinton }
7479683Slinton |
7489683Slinton     exp '/' exp
7499683Slinton {
7509683Slinton 	$$ = build(O_DIVF, $1, $3);
7519683Slinton }
7529683Slinton |
7539683Slinton     exp DIV exp
7549683Slinton {
7559683Slinton 	$$ = build(O_DIV, $1, $3);
7569683Slinton }
7579683Slinton |
7589683Slinton     exp MOD exp
7599683Slinton {
7609683Slinton 	$$ = build(O_MOD, $1, $3);
7619683Slinton }
7629683Slinton |
7639683Slinton     exp AND exp
7649683Slinton {
7659683Slinton 	$$ = build(O_AND, $1, $3);
7669683Slinton }
7679683Slinton |
7689683Slinton     exp OR exp
7699683Slinton {
7709683Slinton 	$$ = build(O_OR, $1, $3);
7719683Slinton }
7729683Slinton |
7739683Slinton     exp '<' exp
7749683Slinton {
7759683Slinton 	$$ = build(O_LT, $1, $3);
7769683Slinton }
7779683Slinton |
7789683Slinton     exp '<' '=' exp
7799683Slinton {
7809683Slinton 	$$ = build(O_LE, $1, $4);
7819683Slinton }
7829683Slinton |
7839683Slinton     exp '>' exp
7849683Slinton {
7859683Slinton 	$$ = build(O_GT, $1, $3);
7869683Slinton }
7879683Slinton |
7889683Slinton     exp '>' '=' exp
7899683Slinton {
7909683Slinton 	$$ = build(O_GE, $1, $4);
7919683Slinton }
7929683Slinton |
7939683Slinton     exp '=' exp
7949683Slinton {
7959683Slinton 	$$ = build(O_EQ, $1, $3);
7969683Slinton }
7979683Slinton |
7989683Slinton     exp '=' '=' exp
7999683Slinton {
8009683Slinton 	$$ = build(O_EQ, $1, $4);
8019683Slinton }
8029683Slinton |
8039683Slinton     exp '<' '>' exp
8049683Slinton {
8059683Slinton 	$$ = build(O_NE, $1, $4);
8069683Slinton }
8079683Slinton |
8089683Slinton     exp '!' '=' exp
8099683Slinton {
8109683Slinton 	$$ = build(O_NE, $1, $4);
8119683Slinton }
8129683Slinton |
8139683Slinton     '(' exp ')'
8149683Slinton {
8159683Slinton 	$$ = $2;
8169683Slinton }
8179683Slinton ;
8189683Slinton term:
8199683Slinton     symbol
8209683Slinton {
8219683Slinton 	$$ = $1;
8229683Slinton }
8239683Slinton |
8249683Slinton     term '[' exp_list ']'
8259683Slinton {
8269683Slinton 	$$ = subscript($1, $3);
8279683Slinton }
8289683Slinton |
8299683Slinton     term '.' name
8309683Slinton {
8319683Slinton 	$$ = dot($1, $3);
8329683Slinton }
8339683Slinton |
8349683Slinton     term ARROW name
8359683Slinton {
8369683Slinton 	$$ = dot($1, $3);
8379683Slinton }
8389683Slinton |
8399683Slinton     '*' term %prec UNARYSIGN
8409683Slinton {
8419683Slinton 	$$ = build(O_INDIR, $2);
8429683Slinton }
8439683Slinton |
8449683Slinton     '*' '(' exp ')' %prec UNARYSIGN
8459683Slinton {
8469683Slinton 	$$ = build(O_INDIR, $3);
8479683Slinton }
8489683Slinton |
8499683Slinton     term '^' %prec UNARYSIGN
8509683Slinton {
8519683Slinton 	$$ = build(O_INDIR, $1);
8529683Slinton }
8539683Slinton |
8549683Slinton     '#' term %prec UNARYSIGN
8559683Slinton {
8569683Slinton 	$$ = concrete($2);
8579683Slinton }
8589683Slinton |
85912482Slinton     term '(' opt_exp_list ')'
8609683Slinton {
8619683Slinton 	$$ = build(O_CALL, $1, $3);
8629683Slinton }
8639683Slinton ;
8649683Slinton boolean_exp:
8659683Slinton     exp
8669683Slinton {
8679683Slinton 	chkboolean($1);
8689683Slinton 	$$ = $1;
8699683Slinton }
8709683Slinton ;
8719683Slinton constant:
8729683Slinton     INT
8739683Slinton {
8749683Slinton 	$$ = build(O_LCON, $1);
8759683Slinton }
8769683Slinton |
8779683Slinton     REAL
8789683Slinton {
8799683Slinton 	$$ = build(O_FCON, $1);
8809683Slinton }
8819683Slinton |
8829683Slinton     STRING
8839683Slinton {
8849683Slinton 	$$ = build(O_SCON, $1);
8859683Slinton }
8869683Slinton ;
8879683Slinton symbol:
8889683Slinton     name
8899683Slinton {
8909683Slinton 	$$ = build(O_SYM, which($1));
8919683Slinton }
8929683Slinton ;
8939683Slinton name:
8949683Slinton     NAME
8959683Slinton {
8969683Slinton 	$$ = $1;
8979683Slinton }
8989683Slinton |
8999683Slinton     keyword
9009683Slinton {
9019683Slinton 	$$ = $1;
9029683Slinton }
9039683Slinton keyword:
90412536Scsvaf     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV |
90512536Scsvaf     DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
9069683Slinton     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
9079683Slinton     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
9089683Slinton     STOP | STOPI | TRACE | TRACEI |
90913840Slinton     USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH
9109683Slinton ;
911