xref: /csrg-svn/old/dbx/commands.y (revision 12524)
19683Slinton %{
29683Slinton 
39683Slinton /* Copyright (c) 1982 Regents of the University of California */
49683Slinton 
5*12524Slinton static char sccsid[] = "@(#)commands.y 1.6 05/18/83";
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"
199683Slinton 
209683Slinton private String curformat = "X";
219683Slinton 
229683Slinton %}
239683Slinton 
249683Slinton %term
259683Slinton     ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP
269683Slinton     EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR
279683Slinton     PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
289683Slinton     STOP STOPI TRACE TRACEI
299683Slinton     USE WHATIS WHEN WHERE WHEREIS WHICH
309683Slinton 
319683Slinton %term INT REAL NAME STRING
329683Slinton %term LFORMER RFORMER ABSTRACTION ARROW
339683Slinton 
349683Slinton %right INT
359683Slinton %binary REDIRECT
369683Slinton %binary '<' '=' '>' '!' IN
379683Slinton %left '+' '-' OR
389683Slinton %left UNARYSIGN
399683Slinton %left '*' '/' DIV MOD AND
409683Slinton %left NOT '(' '[' '.' '^' ARROW
4111173Slinton %left '\\'
429683Slinton 
439683Slinton %union {
449683Slinton     Name y_name;
459683Slinton     Symbol y_sym;
469683Slinton     Node y_node;
479683Slinton     Integer y_int;
489683Slinton     Operator y_op;
499683Slinton     long y_long;
509683Slinton     double y_real;
519683Slinton     String y_string;
529683Slinton     Boolean y_bool;
539683Slinton     Cmdlist y_cmdlist;
549683Slinton };
559683Slinton 
569683Slinton %type <y_op>	    trace stop
579683Slinton %type <y_long>	    INT count
589683Slinton %type <y_real>	    REAL
599683Slinton %type <y_string>    STRING redirectout filename opt_filename mode
609683Slinton %type <y_name>	    ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP
619683Slinton %type <y_name>	    EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD
629683Slinton %type <y_name>	    NEXT NEXTI NIL NOT OR
639683Slinton %type <y_name>	    PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI
649683Slinton %type <y_name>	    STOP STOPI TRACE TRACEI
659683Slinton %type <y_name>	    USE WHATIS WHEN WHERE WHEREIS WHICH
669683Slinton %type <y_name>	    name NAME keyword
679683Slinton %type <y_node>      symbol
689683Slinton %type <y_node>	    command rcommand cmd step what where examine
6912482Slinton %type <y_node>	    event opt_exp_list opt_cond
709683Slinton %type <y_node>	    exp_list exp term boolean_exp constant address
719683Slinton %type <y_node>	    alias_command list_command line_number
729683Slinton %type <y_cmdlist>   actions
739683Slinton 
749683Slinton %%
759683Slinton 
769683Slinton input:
779683Slinton     input command_nl
789683Slinton |
799683Slinton     /* empty */
809683Slinton ;
819683Slinton command_nl:
829683Slinton     command_line '\n'
839683Slinton |
849683Slinton     command_line ';'
859683Slinton |
869683Slinton     '\n'
879683Slinton ;
889683Slinton 
899683Slinton command_line:
909683Slinton     command
919683Slinton {
929683Slinton 	if ($1 != nil) {
939683Slinton 	    eval($1);
949683Slinton 	}
959683Slinton }
969683Slinton |
979683Slinton     rcommand redirectout
989683Slinton {
999683Slinton 	if ($1 != nil) {
1009683Slinton 	    if ($2 != nil) {
1019683Slinton 		setout($2);
1029683Slinton 		eval($1);
1039683Slinton 		unsetout();
1049683Slinton 	    } else {
1059683Slinton 		eval($1);
1069683Slinton 	    }
1079683Slinton 	}
1089683Slinton }
1099683Slinton ;
1109683Slinton redirectout:
1119683Slinton     '>' shellmode NAME
1129683Slinton {
1139683Slinton 	$$ = ident($3);
1149683Slinton }
1159683Slinton |
1169683Slinton     /* empty */
1179683Slinton {
1189683Slinton 	$$ = nil;
1199683Slinton }
1209683Slinton ;
1219683Slinton 
1229683Slinton /*
1239683Slinton  * Non-redirectable commands.
1249683Slinton  */
1259683Slinton command:
1269683Slinton     alias_command
1279683Slinton {
1289683Slinton 	$$ = $1;
1299683Slinton }
1309683Slinton |
1319683Slinton     ASSIGN term '=' exp
1329683Slinton {
1339683Slinton 	$$ = build(O_ASSIGN, $2, $4);
1349683Slinton }
1359683Slinton |
1369683Slinton     CATCH INT
1379683Slinton {
1389683Slinton 	$$ = build(O_CATCH, $2);
1399683Slinton }
1409683Slinton |
1419683Slinton     CONT
1429683Slinton {
14311870Slinton 	$$ = build(O_CONT, (long) 0);
1449683Slinton }
1459683Slinton |
14611870Slinton     CONT INT
14711870Slinton {
14811870Slinton 	$$ = build(O_CONT, $2);
14911870Slinton }
15011870Slinton |
1519683Slinton     DELETE INT
1529683Slinton {
1539683Slinton 	$$ = build(O_DELETE, $2);
1549683Slinton }
1559683Slinton |
1569683Slinton     EDIT shellmode opt_filename
1579683Slinton {
1589683Slinton 	$$ = build(O_EDIT, $3);
1599683Slinton }
1609683Slinton |
1619683Slinton     FILE shellmode opt_filename
1629683Slinton {
1639683Slinton 	$$ = build(O_CHFILE, $3);
1649683Slinton }
1659683Slinton |
1669683Slinton     FUNC
1679683Slinton {
1689683Slinton 	$$ = build(O_FUNC, nil);
1699683Slinton }
1709683Slinton |
1719683Slinton     FUNC symbol
1729683Slinton {
1739683Slinton 	$$ = build(O_FUNC, $2);
1749683Slinton }
1759683Slinton |
1769683Slinton     GRIPE
1779683Slinton {
1789683Slinton 	$$ = build(O_GRIPE);
1799683Slinton }
1809683Slinton |
1819683Slinton     HELP
1829683Slinton {
1839683Slinton 	$$ = build(O_HELP);
1849683Slinton }
1859683Slinton |
1869683Slinton     IGNORE INT
1879683Slinton {
1889683Slinton 	$$ = build(O_IGNORE, $2);
1899683Slinton }
1909683Slinton |
1919683Slinton     list_command
1929683Slinton {
1939683Slinton 	$$ = $1;
1949683Slinton }
1959683Slinton |
1969683Slinton     PSYM term
1979683Slinton {
1989683Slinton 	$$ = build(O_PSYM, $2);
1999683Slinton }
2009683Slinton |
2019683Slinton     QUIT
2029683Slinton {
2039683Slinton 	if (not popinput()) {
2049683Slinton 	    quit(0);
2059683Slinton 	} else {
2069683Slinton 	    $$ = nil;
2079683Slinton 	}
2089683Slinton }
2099683Slinton |
2109683Slinton     runcommand
2119683Slinton {
2129683Slinton 	run();
2139683Slinton 	/* NOTREACHED */
2149683Slinton }
2159683Slinton |
2169683Slinton     SH
2179683Slinton {
2189683Slinton 	shellline();
2199683Slinton 	$$ = nil;
2209683Slinton }
2219683Slinton |
2229683Slinton     SOURCE shellmode filename
2239683Slinton {
2249683Slinton 	$$ = build(O_SOURCE, $3);
2259683Slinton }
2269683Slinton |
2279683Slinton     step
2289683Slinton {
2299683Slinton 	$$ = $1;
2309683Slinton }
2319683Slinton |
2329683Slinton     stop where opt_cond
2339683Slinton {
2349683Slinton 	$$ = build($1, nil, $2, $3);
2359683Slinton }
2369683Slinton |
2379683Slinton     stop what opt_cond
2389683Slinton {
2399683Slinton 	$$ = build($1, $2, nil, $3);
2409683Slinton }
2419683Slinton |
2429683Slinton     stop IF boolean_exp
2439683Slinton {
2449683Slinton 	$$ = build($1, nil, nil, $3);
2459683Slinton }
2469683Slinton |
2479683Slinton     trace what where opt_cond
2489683Slinton {
2499683Slinton 	$$ = build($1, $2, $3, $4);
2509683Slinton }
2519683Slinton |
2529683Slinton     trace where opt_cond
2539683Slinton {
2549683Slinton 	$$ = build($1, nil, $2, $3);
2559683Slinton }
2569683Slinton |
2579683Slinton     trace what opt_cond
2589683Slinton {
2599683Slinton 	$$ = build($1, $2, nil, $3);
2609683Slinton }
2619683Slinton |
2629683Slinton     trace opt_cond
2639683Slinton {
2649683Slinton 	$$ = build($1, nil, nil, $2);
2659683Slinton }
2669683Slinton |
2679683Slinton     WHATIS term
2689683Slinton {
2699683Slinton 	$$ = build(O_WHATIS, $2);
2709683Slinton }
2719683Slinton |
2729683Slinton     WHEN event '{' actions '}'
2739683Slinton {
2749683Slinton 	$$ = build(O_ADDEVENT, $2, $4);
2759683Slinton }
2769683Slinton |
2779683Slinton     WHEREIS symbol
2789683Slinton {
2799683Slinton 	$$ = build(O_WHEREIS, $2);
2809683Slinton }
2819683Slinton |
2829683Slinton     WHICH symbol
2839683Slinton {
2849683Slinton 	$$ = build(O_WHICH, $2);
2859683Slinton }
2869683Slinton |
2879683Slinton     USE shellmode sourcepath
2889683Slinton {
2899683Slinton 	$$ = nil;
2909683Slinton 	if (list_size(sourcepath) == 0) {
2919683Slinton 	    list_append(list_item("."), nil, sourcepath);
2929683Slinton 	}
2939683Slinton }
2949683Slinton ;
2959683Slinton runcommand:
296*12524Slinton     run { arginit(); } arglist
29712482Slinton |
298*12524Slinton     run
2999683Slinton ;
3009683Slinton run:
301*12524Slinton     RUN shellmode
3029683Slinton {
3039683Slinton 	fflush(stdout);
3049683Slinton }
3059683Slinton ;
3069683Slinton arglist:
3079683Slinton     arglist arg
3089683Slinton |
30912482Slinton     arg
3109683Slinton ;
3119683Slinton arg:
3129683Slinton     NAME
3139683Slinton {
3149683Slinton 	newarg(ident($1));
3159683Slinton }
3169683Slinton |
3179683Slinton     '<' NAME
3189683Slinton {
3199683Slinton 	inarg(ident($2));
3209683Slinton }
3219683Slinton |
3229683Slinton     '>' NAME
3239683Slinton {
3249683Slinton 	outarg(ident($2));
3259683Slinton }
3269683Slinton ;
3279683Slinton step:
3289683Slinton     STEP
3299683Slinton {
3309683Slinton 	$$ = build(O_STEP, true, false);
3319683Slinton }
3329683Slinton |
3339683Slinton     STEPI
3349683Slinton {
3359683Slinton 	$$ = build(O_STEP, false, false);
3369683Slinton }
3379683Slinton |
3389683Slinton     NEXT
3399683Slinton {
3409683Slinton 	$$ = build(O_STEP, true, true);
3419683Slinton }
3429683Slinton |
3439683Slinton     NEXTI
3449683Slinton {
3459683Slinton 	$$ = build(O_STEP, false, true);
3469683Slinton }
3479683Slinton ;
3489683Slinton shellmode:
3499683Slinton     /* empty */
3509683Slinton {
3519683Slinton 	beginshellmode();
3529683Slinton }
3539683Slinton ;
3549683Slinton sourcepath:
3559683Slinton     sourcepath NAME
3569683Slinton {
3579683Slinton 	list_append(list_item(ident($2)), nil, sourcepath);
3589683Slinton }
3599683Slinton |
3609683Slinton     /* empty */
3619683Slinton {
3629683Slinton 	String dir;
3639683Slinton 
3649683Slinton 	foreach (String, dir, sourcepath)
3659683Slinton 	    list_delete(list_curitem(sourcepath), sourcepath);
3669683Slinton 	endfor
3679683Slinton }
3689683Slinton ;
3699683Slinton event:
3709683Slinton     where
3719683Slinton |
3729683Slinton     exp
3739683Slinton ;
3749683Slinton actions:
3759683Slinton     actions cmd ';'
3769683Slinton {
3779683Slinton 	$$ = $1;
3789683Slinton 	cmdlist_append($2, $$);
3799683Slinton }
3809683Slinton |
3819683Slinton     cmd ';'
3829683Slinton {
3839683Slinton 	$$ = list_alloc();
3849683Slinton 	cmdlist_append($1, $$);
3859683Slinton }
3869683Slinton ;
3879683Slinton cmd:
3889683Slinton     command
3899683Slinton |
3909683Slinton     rcommand
3919683Slinton ;
3929683Slinton 
3939683Slinton /*
3949683Slinton  * Redirectable commands.
3959683Slinton  */
3969683Slinton rcommand:
3979683Slinton     PRINT exp_list
3989683Slinton {
3999683Slinton 	$$ = build(O_PRINT, $2);
4009683Slinton }
4019683Slinton |
4029683Slinton     WHERE
4039683Slinton {
4049683Slinton 	$$ = build(O_WHERE);
4059683Slinton }
4069683Slinton |
4079683Slinton     examine
4089683Slinton {
4099683Slinton 	$$ = $1;
4109683Slinton }
4119683Slinton |
4129683Slinton     CALL term
4139683Slinton {
4149683Slinton 	$$ = $2;
4159683Slinton }
4169683Slinton |
4179683Slinton     DUMP
4189683Slinton {
4199683Slinton 	$$ = build(O_DUMP);
4209683Slinton }
4219683Slinton |
4229683Slinton     STATUS
4239683Slinton {
4249683Slinton 	$$ = build(O_STATUS);
4259683Slinton }
4269683Slinton ;
4279683Slinton alias_command:
4289683Slinton     ALIAS name name
4299683Slinton {
4309683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
4319683Slinton }
4329683Slinton |
4339683Slinton     ALIAS name
4349683Slinton {
4359683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
4369683Slinton }
4379683Slinton |
4389683Slinton     ALIAS
4399683Slinton {
4409683Slinton 	$$ = build(O_ALIAS, nil, nil);
4419683Slinton }
4429683Slinton ;
4439683Slinton trace:
4449683Slinton     TRACE
4459683Slinton {
4469683Slinton 	$$ = O_TRACE;
4479683Slinton }
4489683Slinton |
4499683Slinton     TRACEI
4509683Slinton {
4519683Slinton 	$$ = O_TRACEI;
4529683Slinton }
4539683Slinton ;
4549683Slinton stop:
4559683Slinton     STOP
4569683Slinton {
4579683Slinton 	$$ = O_STOP;
4589683Slinton }
4599683Slinton |
4609683Slinton     STOPI
4619683Slinton {
4629683Slinton 	$$ = O_STOPI;
4639683Slinton }
4649683Slinton ;
4659683Slinton what:
4669683Slinton     exp
4679683Slinton {
4689683Slinton 	$$ = $1;
4699683Slinton }
4709683Slinton |
4719683Slinton     STRING ':' line_number
4729683Slinton {
4739683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
4749683Slinton }
4759683Slinton ;
4769683Slinton where:
4779683Slinton     IN term
4789683Slinton {
4799683Slinton 	$$ = $2;
4809683Slinton }
4819683Slinton |
4829683Slinton     AT line_number
4839683Slinton {
4849683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
4859683Slinton }
4869683Slinton |
4879683Slinton     AT STRING ':' line_number
4889683Slinton {
4899683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
4909683Slinton }
4919683Slinton ;
4929683Slinton filename:
4939683Slinton     NAME
4949683Slinton {
4959683Slinton 	$$ = ident($1);
4969683Slinton }
4979683Slinton ;
4989683Slinton opt_filename:
4999683Slinton     /* empty */
5009683Slinton {
5019683Slinton 	$$ = nil;
5029683Slinton }
5039683Slinton |
5049683Slinton     filename
5059683Slinton {
5069683Slinton 	$$ = $1;
5079683Slinton }
5089683Slinton ;
50912482Slinton opt_exp_list:
51012482Slinton     exp_list
5119683Slinton {
51212482Slinton 	$$ = $1;
5139683Slinton }
5149683Slinton |
51512482Slinton     /* empty */
5169683Slinton {
51712482Slinton 	$$ = nil;
5189683Slinton }
5199683Slinton ;
5209683Slinton list_command:
5219683Slinton     LIST
5229683Slinton {
5239683Slinton 	$$ = build(O_LIST,
5249683Slinton 	    build(O_LCON, (long) cursrcline),
5259683Slinton 	    build(O_LCON, (long) cursrcline + 9)
5269683Slinton 	);
5279683Slinton }
5289683Slinton |
5299683Slinton     LIST line_number
5309683Slinton {
5319683Slinton 	$$ = build(O_LIST, $2, $2);
5329683Slinton }
5339683Slinton |
5349683Slinton     LIST line_number ',' line_number
5359683Slinton {
5369683Slinton 	$$ = build(O_LIST, $2, $4);
5379683Slinton }
5389683Slinton |
5399683Slinton     LIST symbol
5409683Slinton {
5419683Slinton 	$$ = build(O_LIST, $2);
5429683Slinton }
5439683Slinton ;
5449683Slinton line_number:
5459683Slinton     INT
5469683Slinton {
5479683Slinton 	$$ = build(O_LCON, $1);
5489683Slinton }
5499683Slinton |
5509683Slinton     '$'
5519683Slinton {
5529683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
5539683Slinton }
5549683Slinton ;
5559683Slinton examine:
5569683Slinton     address '/' count mode
5579683Slinton {
5589683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
5599683Slinton }
5609683Slinton |
5619683Slinton     address ',' address '/' mode
5629683Slinton {
5639683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
5649683Slinton }
5659683Slinton |
5669683Slinton     '/' count mode
5679683Slinton {
5689683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
5699683Slinton }
57011173Slinton |
57111173Slinton     address '=' mode
57211173Slinton {
57311173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
57411173Slinton }
5759683Slinton ;
5769683Slinton address:
5779683Slinton     INT
5789683Slinton {
5799683Slinton 	$$ = build(O_LCON, $1);
5809683Slinton }
5819683Slinton |
5829683Slinton     '&' term
5839683Slinton {
5849683Slinton 	$$ = amper($2);
5859683Slinton }
5869683Slinton |
5879683Slinton     address '+' address
5889683Slinton {
5899683Slinton 	$$ = build(O_ADD, $1, $3);
5909683Slinton }
5919683Slinton |
5929683Slinton     address '-' address
5939683Slinton {
5949683Slinton 	$$ = build(O_SUB, $1, $3);
5959683Slinton }
5969683Slinton |
5979683Slinton     address '*' address
5989683Slinton {
5999683Slinton 	$$ = build(O_MUL, $1, $3);
6009683Slinton }
6019683Slinton |
6029683Slinton     '*' address %prec UNARYSIGN
6039683Slinton {
6049683Slinton 	$$ = build(O_INDIR, $2);
6059683Slinton }
6069683Slinton |
6079683Slinton     '(' exp ')'
6089683Slinton {
6099683Slinton 	$$ = $2;
6109683Slinton }
6119683Slinton ;
6129683Slinton count:
6139683Slinton     /* empty */
6149683Slinton {
6159683Slinton 	$$ = 1;
6169683Slinton }
6179683Slinton |
6189683Slinton     INT
6199683Slinton {
6209683Slinton 	$$ = $1;
6219683Slinton }
6229683Slinton ;
6239683Slinton mode:
6249683Slinton     name
6259683Slinton {
6269683Slinton 	$$ = ident($1);
6279683Slinton 	curformat = $$;
6289683Slinton }
6299683Slinton |
6309683Slinton     /* empty */
6319683Slinton {
6329683Slinton 	$$ = curformat;
6339683Slinton }
6349683Slinton ;
6359683Slinton opt_cond:
6369683Slinton     /* empty */
6379683Slinton {
6389683Slinton 	$$ = nil;
6399683Slinton }
6409683Slinton |
6419683Slinton     IF boolean_exp
6429683Slinton {
6439683Slinton 	$$ = $2;
6449683Slinton }
6459683Slinton ;
6469683Slinton exp_list:
6479683Slinton     exp
6489683Slinton {
6499683Slinton 	$$ = build(O_COMMA, $1, nil);
6509683Slinton }
6519683Slinton |
6529683Slinton     exp ',' exp_list
6539683Slinton {
6549683Slinton 	$$ = build(O_COMMA, $1, $3);
6559683Slinton }
6569683Slinton ;
6579683Slinton exp:
6589683Slinton     term
6599683Slinton {
6609683Slinton 	$$ = build(O_RVAL, $1);
6619683Slinton }
6629683Slinton |
6639683Slinton     constant
6649683Slinton {
6659683Slinton 	$$ = $1;
6669683Slinton }
6679683Slinton |
66811173Slinton     exp '\\' symbol
66911173Slinton {
67011173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
67111173Slinton }
67211173Slinton |
6739683Slinton     '+' exp %prec UNARYSIGN
6749683Slinton {
6759683Slinton 	$$ = $2;
6769683Slinton }
6779683Slinton |
6789683Slinton     '-' exp %prec UNARYSIGN
6799683Slinton {
6809683Slinton 	$$ = build(O_NEG, $2);
6819683Slinton }
6829683Slinton |
6839683Slinton     '&' exp %prec UNARYSIGN
6849683Slinton {
6859683Slinton 	$$ = amper($2);
6869683Slinton }
6879683Slinton |
6889683Slinton     exp '+' exp
6899683Slinton {
6909683Slinton 	$$ = build(O_ADD, $1, $3);
6919683Slinton }
6929683Slinton |
6939683Slinton     exp '-' exp
6949683Slinton {
6959683Slinton 	$$ = build(O_SUB, $1, $3);
6969683Slinton }
6979683Slinton |
6989683Slinton     exp '*' exp
6999683Slinton {
7009683Slinton 	$$ = build(O_MUL, $1, $3);
7019683Slinton }
7029683Slinton |
7039683Slinton     exp '/' exp
7049683Slinton {
7059683Slinton 	$$ = build(O_DIVF, $1, $3);
7069683Slinton }
7079683Slinton |
7089683Slinton     exp DIV exp
7099683Slinton {
7109683Slinton 	$$ = build(O_DIV, $1, $3);
7119683Slinton }
7129683Slinton |
7139683Slinton     exp MOD exp
7149683Slinton {
7159683Slinton 	$$ = build(O_MOD, $1, $3);
7169683Slinton }
7179683Slinton |
7189683Slinton     exp AND exp
7199683Slinton {
7209683Slinton 	$$ = build(O_AND, $1, $3);
7219683Slinton }
7229683Slinton |
7239683Slinton     exp OR exp
7249683Slinton {
7259683Slinton 	$$ = build(O_OR, $1, $3);
7269683Slinton }
7279683Slinton |
7289683Slinton     exp '<' exp
7299683Slinton {
7309683Slinton 	$$ = build(O_LT, $1, $3);
7319683Slinton }
7329683Slinton |
7339683Slinton     exp '<' '=' exp
7349683Slinton {
7359683Slinton 	$$ = build(O_LE, $1, $4);
7369683Slinton }
7379683Slinton |
7389683Slinton     exp '>' exp
7399683Slinton {
7409683Slinton 	$$ = build(O_GT, $1, $3);
7419683Slinton }
7429683Slinton |
7439683Slinton     exp '>' '=' exp
7449683Slinton {
7459683Slinton 	$$ = build(O_GE, $1, $4);
7469683Slinton }
7479683Slinton |
7489683Slinton     exp '=' exp
7499683Slinton {
7509683Slinton 	$$ = build(O_EQ, $1, $3);
7519683Slinton }
7529683Slinton |
7539683Slinton     exp '=' '=' exp
7549683Slinton {
7559683Slinton 	$$ = build(O_EQ, $1, $4);
7569683Slinton }
7579683Slinton |
7589683Slinton     exp '<' '>' exp
7599683Slinton {
7609683Slinton 	$$ = build(O_NE, $1, $4);
7619683Slinton }
7629683Slinton |
7639683Slinton     exp '!' '=' exp
7649683Slinton {
7659683Slinton 	$$ = build(O_NE, $1, $4);
7669683Slinton }
7679683Slinton |
7689683Slinton     '(' exp ')'
7699683Slinton {
7709683Slinton 	$$ = $2;
7719683Slinton }
7729683Slinton ;
7739683Slinton term:
7749683Slinton     symbol
7759683Slinton {
7769683Slinton 	$$ = $1;
7779683Slinton }
7789683Slinton |
7799683Slinton     term '[' exp_list ']'
7809683Slinton {
7819683Slinton 	$$ = subscript($1, $3);
7829683Slinton }
7839683Slinton |
7849683Slinton     term '.' name
7859683Slinton {
7869683Slinton 	$$ = dot($1, $3);
7879683Slinton }
7889683Slinton |
7899683Slinton     term ARROW name
7909683Slinton {
7919683Slinton 	$$ = dot($1, $3);
7929683Slinton }
7939683Slinton |
7949683Slinton     '*' term %prec UNARYSIGN
7959683Slinton {
7969683Slinton 	$$ = build(O_INDIR, $2);
7979683Slinton }
7989683Slinton |
7999683Slinton     '*' '(' exp ')' %prec UNARYSIGN
8009683Slinton {
8019683Slinton 	$$ = build(O_INDIR, $3);
8029683Slinton }
8039683Slinton |
8049683Slinton     term '^' %prec UNARYSIGN
8059683Slinton {
8069683Slinton 	$$ = build(O_INDIR, $1);
8079683Slinton }
8089683Slinton |
8099683Slinton     '#' term %prec UNARYSIGN
8109683Slinton {
8119683Slinton 	$$ = concrete($2);
8129683Slinton }
8139683Slinton |
81412482Slinton     term '(' opt_exp_list ')'
8159683Slinton {
8169683Slinton 	$$ = build(O_CALL, $1, $3);
8179683Slinton }
8189683Slinton ;
8199683Slinton boolean_exp:
8209683Slinton     exp
8219683Slinton {
8229683Slinton 	chkboolean($1);
8239683Slinton 	$$ = $1;
8249683Slinton }
8259683Slinton ;
8269683Slinton constant:
8279683Slinton     INT
8289683Slinton {
8299683Slinton 	$$ = build(O_LCON, $1);
8309683Slinton }
8319683Slinton |
8329683Slinton     REAL
8339683Slinton {
8349683Slinton 	$$ = build(O_FCON, $1);
8359683Slinton }
8369683Slinton |
8379683Slinton     STRING
8389683Slinton {
8399683Slinton 	$$ = build(O_SCON, $1);
8409683Slinton }
8419683Slinton ;
8429683Slinton symbol:
8439683Slinton     name
8449683Slinton {
8459683Slinton 	$$ = build(O_SYM, which($1));
8469683Slinton }
8479683Slinton ;
8489683Slinton name:
8499683Slinton     NAME
8509683Slinton {
8519683Slinton 	$$ = $1;
8529683Slinton }
8539683Slinton |
8549683Slinton     keyword
8559683Slinton {
8569683Slinton 	$$ = $1;
8579683Slinton }
8589683Slinton keyword:
8599683Slinton     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DELETE | DIV | DUMP |
8609683Slinton     EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
8619683Slinton     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
8629683Slinton     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
8639683Slinton     STOP | STOPI | TRACE | TRACEI |
8649683Slinton     USE | WHATIS | WHEN | WHERE | WHICH
8659683Slinton ;
866