xref: /csrg-svn/old/dbx/commands.y (revision 11870)
19683Slinton %{
29683Slinton 
39683Slinton /* Copyright (c) 1982 Regents of the University of California */
49683Slinton 
5*11870Slinton static char sccsid[] = "@(#)commands.y 1.4 04/08/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
699683Slinton %type <y_node>	    event opt_arglist 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 {
143*11870Slinton 	$$ = build(O_CONT, (long) 0);
1449683Slinton }
1459683Slinton |
146*11870Slinton     CONT INT
147*11870Slinton {
148*11870Slinton 	$$ = build(O_CONT, $2);
149*11870Slinton }
150*11870Slinton |
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:
2969683Slinton     run shellmode arglist
2979683Slinton ;
2989683Slinton run:
2999683Slinton     RUN
3009683Slinton {
3019683Slinton 	fflush(stdout);
3029683Slinton 	arginit();
3039683Slinton }
3049683Slinton ;
3059683Slinton arglist:
3069683Slinton     arglist arg
3079683Slinton |
3089683Slinton     /* empty */
3099683Slinton ;
3109683Slinton arg:
3119683Slinton     NAME
3129683Slinton {
3139683Slinton 	newarg(ident($1));
3149683Slinton }
3159683Slinton |
3169683Slinton     '<' NAME
3179683Slinton {
3189683Slinton 	inarg(ident($2));
3199683Slinton }
3209683Slinton |
3219683Slinton     '>' NAME
3229683Slinton {
3239683Slinton 	outarg(ident($2));
3249683Slinton }
3259683Slinton ;
3269683Slinton step:
3279683Slinton     STEP
3289683Slinton {
3299683Slinton 	$$ = build(O_STEP, true, false);
3309683Slinton }
3319683Slinton |
3329683Slinton     STEPI
3339683Slinton {
3349683Slinton 	$$ = build(O_STEP, false, false);
3359683Slinton }
3369683Slinton |
3379683Slinton     NEXT
3389683Slinton {
3399683Slinton 	$$ = build(O_STEP, true, true);
3409683Slinton }
3419683Slinton |
3429683Slinton     NEXTI
3439683Slinton {
3449683Slinton 	$$ = build(O_STEP, false, true);
3459683Slinton }
3469683Slinton ;
3479683Slinton shellmode:
3489683Slinton     /* empty */
3499683Slinton {
3509683Slinton 	beginshellmode();
3519683Slinton }
3529683Slinton ;
3539683Slinton sourcepath:
3549683Slinton     sourcepath NAME
3559683Slinton {
3569683Slinton 	list_append(list_item(ident($2)), nil, sourcepath);
3579683Slinton }
3589683Slinton |
3599683Slinton     /* empty */
3609683Slinton {
3619683Slinton 	String dir;
3629683Slinton 
3639683Slinton 	foreach (String, dir, sourcepath)
3649683Slinton 	    list_delete(list_curitem(sourcepath), sourcepath);
3659683Slinton 	endfor
3669683Slinton }
3679683Slinton ;
3689683Slinton event:
3699683Slinton     where
3709683Slinton |
3719683Slinton     exp
3729683Slinton ;
3739683Slinton actions:
3749683Slinton     actions cmd ';'
3759683Slinton {
3769683Slinton 	$$ = $1;
3779683Slinton 	cmdlist_append($2, $$);
3789683Slinton }
3799683Slinton |
3809683Slinton     cmd ';'
3819683Slinton {
3829683Slinton 	$$ = list_alloc();
3839683Slinton 	cmdlist_append($1, $$);
3849683Slinton }
3859683Slinton ;
3869683Slinton cmd:
3879683Slinton     command
3889683Slinton |
3899683Slinton     rcommand
3909683Slinton ;
3919683Slinton 
3929683Slinton /*
3939683Slinton  * Redirectable commands.
3949683Slinton  */
3959683Slinton rcommand:
3969683Slinton     PRINT exp_list
3979683Slinton {
3989683Slinton 	$$ = build(O_PRINT, $2);
3999683Slinton }
4009683Slinton |
4019683Slinton     WHERE
4029683Slinton {
4039683Slinton 	$$ = build(O_WHERE);
4049683Slinton }
4059683Slinton |
4069683Slinton     examine
4079683Slinton {
4089683Slinton 	$$ = $1;
4099683Slinton }
4109683Slinton |
4119683Slinton     CALL term
4129683Slinton {
4139683Slinton 	$$ = $2;
4149683Slinton }
4159683Slinton |
4169683Slinton     DUMP
4179683Slinton {
4189683Slinton 	$$ = build(O_DUMP);
4199683Slinton }
4209683Slinton |
4219683Slinton     STATUS
4229683Slinton {
4239683Slinton 	$$ = build(O_STATUS);
4249683Slinton }
4259683Slinton ;
4269683Slinton alias_command:
4279683Slinton     ALIAS name name
4289683Slinton {
4299683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
4309683Slinton }
4319683Slinton |
4329683Slinton     ALIAS name
4339683Slinton {
4349683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
4359683Slinton }
4369683Slinton |
4379683Slinton     ALIAS
4389683Slinton {
4399683Slinton 	$$ = build(O_ALIAS, nil, nil);
4409683Slinton }
4419683Slinton ;
4429683Slinton trace:
4439683Slinton     TRACE
4449683Slinton {
4459683Slinton 	$$ = O_TRACE;
4469683Slinton }
4479683Slinton |
4489683Slinton     TRACEI
4499683Slinton {
4509683Slinton 	$$ = O_TRACEI;
4519683Slinton }
4529683Slinton ;
4539683Slinton stop:
4549683Slinton     STOP
4559683Slinton {
4569683Slinton 	$$ = O_STOP;
4579683Slinton }
4589683Slinton |
4599683Slinton     STOPI
4609683Slinton {
4619683Slinton 	$$ = O_STOPI;
4629683Slinton }
4639683Slinton ;
4649683Slinton what:
4659683Slinton     exp
4669683Slinton {
4679683Slinton 	$$ = $1;
4689683Slinton }
4699683Slinton |
4709683Slinton     STRING ':' line_number
4719683Slinton {
4729683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
4739683Slinton }
4749683Slinton ;
4759683Slinton where:
4769683Slinton     IN term
4779683Slinton {
4789683Slinton 	$$ = $2;
4799683Slinton }
4809683Slinton |
4819683Slinton     AT line_number
4829683Slinton {
4839683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
4849683Slinton }
4859683Slinton |
4869683Slinton     AT STRING ':' line_number
4879683Slinton {
4889683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
4899683Slinton }
4909683Slinton ;
4919683Slinton filename:
4929683Slinton     NAME
4939683Slinton {
4949683Slinton 	$$ = ident($1);
4959683Slinton }
4969683Slinton ;
4979683Slinton opt_filename:
4989683Slinton     /* empty */
4999683Slinton {
5009683Slinton 	$$ = nil;
5019683Slinton }
5029683Slinton |
5039683Slinton     filename
5049683Slinton {
5059683Slinton 	$$ = $1;
5069683Slinton }
5079683Slinton ;
5089683Slinton opt_arglist:
5099683Slinton     /* empty */
5109683Slinton {
5119683Slinton 	$$ = nil;
5129683Slinton }
5139683Slinton |
5149683Slinton     '(' exp_list ')'
5159683Slinton {
5169683Slinton 	$$ = $2;
5179683Slinton }
5189683Slinton ;
5199683Slinton list_command:
5209683Slinton     LIST
5219683Slinton {
5229683Slinton 	$$ = build(O_LIST,
5239683Slinton 	    build(O_LCON, (long) cursrcline),
5249683Slinton 	    build(O_LCON, (long) cursrcline + 9)
5259683Slinton 	);
5269683Slinton }
5279683Slinton |
5289683Slinton     LIST line_number
5299683Slinton {
5309683Slinton 	$$ = build(O_LIST, $2, $2);
5319683Slinton }
5329683Slinton |
5339683Slinton     LIST line_number ',' line_number
5349683Slinton {
5359683Slinton 	$$ = build(O_LIST, $2, $4);
5369683Slinton }
5379683Slinton |
5389683Slinton     LIST symbol
5399683Slinton {
5409683Slinton 	$$ = build(O_LIST, $2);
5419683Slinton }
5429683Slinton ;
5439683Slinton line_number:
5449683Slinton     INT
5459683Slinton {
5469683Slinton 	$$ = build(O_LCON, $1);
5479683Slinton }
5489683Slinton |
5499683Slinton     '$'
5509683Slinton {
5519683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
5529683Slinton }
5539683Slinton ;
5549683Slinton examine:
5559683Slinton     address '/' count mode
5569683Slinton {
5579683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
5589683Slinton }
5599683Slinton |
5609683Slinton     address ',' address '/' mode
5619683Slinton {
5629683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
5639683Slinton }
5649683Slinton |
5659683Slinton     '/' count mode
5669683Slinton {
5679683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
5689683Slinton }
56911173Slinton |
57011173Slinton     address '=' mode
57111173Slinton {
57211173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
57311173Slinton }
5749683Slinton ;
5759683Slinton address:
5769683Slinton     INT
5779683Slinton {
5789683Slinton 	$$ = build(O_LCON, $1);
5799683Slinton }
5809683Slinton |
5819683Slinton     '&' term
5829683Slinton {
5839683Slinton 	$$ = amper($2);
5849683Slinton }
5859683Slinton |
5869683Slinton     address '+' address
5879683Slinton {
5889683Slinton 	$$ = build(O_ADD, $1, $3);
5899683Slinton }
5909683Slinton |
5919683Slinton     address '-' address
5929683Slinton {
5939683Slinton 	$$ = build(O_SUB, $1, $3);
5949683Slinton }
5959683Slinton |
5969683Slinton     address '*' address
5979683Slinton {
5989683Slinton 	$$ = build(O_MUL, $1, $3);
5999683Slinton }
6009683Slinton |
6019683Slinton     '*' address %prec UNARYSIGN
6029683Slinton {
6039683Slinton 	$$ = build(O_INDIR, $2);
6049683Slinton }
6059683Slinton |
6069683Slinton     '(' exp ')'
6079683Slinton {
6089683Slinton 	$$ = $2;
6099683Slinton }
6109683Slinton ;
6119683Slinton count:
6129683Slinton     /* empty */
6139683Slinton {
6149683Slinton 	$$ = 1;
6159683Slinton }
6169683Slinton |
6179683Slinton     INT
6189683Slinton {
6199683Slinton 	$$ = $1;
6209683Slinton }
6219683Slinton ;
6229683Slinton mode:
6239683Slinton     name
6249683Slinton {
6259683Slinton 	$$ = ident($1);
6269683Slinton 	curformat = $$;
6279683Slinton }
6289683Slinton |
6299683Slinton     /* empty */
6309683Slinton {
6319683Slinton 	$$ = curformat;
6329683Slinton }
6339683Slinton ;
6349683Slinton opt_cond:
6359683Slinton     /* empty */
6369683Slinton {
6379683Slinton 	$$ = nil;
6389683Slinton }
6399683Slinton |
6409683Slinton     IF boolean_exp
6419683Slinton {
6429683Slinton 	$$ = $2;
6439683Slinton }
6449683Slinton ;
6459683Slinton exp_list:
6469683Slinton     exp
6479683Slinton {
6489683Slinton 	$$ = build(O_COMMA, $1, nil);
6499683Slinton }
6509683Slinton |
6519683Slinton     exp ',' exp_list
6529683Slinton {
6539683Slinton 	$$ = build(O_COMMA, $1, $3);
6549683Slinton }
6559683Slinton ;
6569683Slinton exp:
6579683Slinton     term
6589683Slinton {
6599683Slinton 	$$ = build(O_RVAL, $1);
6609683Slinton }
6619683Slinton |
6629683Slinton     constant
6639683Slinton {
6649683Slinton 	$$ = $1;
6659683Slinton }
6669683Slinton |
66711173Slinton     exp '\\' symbol
66811173Slinton {
66911173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
67011173Slinton }
67111173Slinton |
6729683Slinton     '+' exp %prec UNARYSIGN
6739683Slinton {
6749683Slinton 	$$ = $2;
6759683Slinton }
6769683Slinton |
6779683Slinton     '-' exp %prec UNARYSIGN
6789683Slinton {
6799683Slinton 	$$ = build(O_NEG, $2);
6809683Slinton }
6819683Slinton |
6829683Slinton     '&' exp %prec UNARYSIGN
6839683Slinton {
6849683Slinton 	$$ = amper($2);
6859683Slinton }
6869683Slinton |
6879683Slinton     exp '+' exp
6889683Slinton {
6899683Slinton 	$$ = build(O_ADD, $1, $3);
6909683Slinton }
6919683Slinton |
6929683Slinton     exp '-' exp
6939683Slinton {
6949683Slinton 	$$ = build(O_SUB, $1, $3);
6959683Slinton }
6969683Slinton |
6979683Slinton     exp '*' exp
6989683Slinton {
6999683Slinton 	$$ = build(O_MUL, $1, $3);
7009683Slinton }
7019683Slinton |
7029683Slinton     exp '/' exp
7039683Slinton {
7049683Slinton 	$$ = build(O_DIVF, $1, $3);
7059683Slinton }
7069683Slinton |
7079683Slinton     exp DIV exp
7089683Slinton {
7099683Slinton 	$$ = build(O_DIV, $1, $3);
7109683Slinton }
7119683Slinton |
7129683Slinton     exp MOD exp
7139683Slinton {
7149683Slinton 	$$ = build(O_MOD, $1, $3);
7159683Slinton }
7169683Slinton |
7179683Slinton     exp AND exp
7189683Slinton {
7199683Slinton 	$$ = build(O_AND, $1, $3);
7209683Slinton }
7219683Slinton |
7229683Slinton     exp OR exp
7239683Slinton {
7249683Slinton 	$$ = build(O_OR, $1, $3);
7259683Slinton }
7269683Slinton |
7279683Slinton     exp '<' exp
7289683Slinton {
7299683Slinton 	$$ = build(O_LT, $1, $3);
7309683Slinton }
7319683Slinton |
7329683Slinton     exp '<' '=' exp
7339683Slinton {
7349683Slinton 	$$ = build(O_LE, $1, $4);
7359683Slinton }
7369683Slinton |
7379683Slinton     exp '>' exp
7389683Slinton {
7399683Slinton 	$$ = build(O_GT, $1, $3);
7409683Slinton }
7419683Slinton |
7429683Slinton     exp '>' '=' exp
7439683Slinton {
7449683Slinton 	$$ = build(O_GE, $1, $4);
7459683Slinton }
7469683Slinton |
7479683Slinton     exp '=' exp
7489683Slinton {
7499683Slinton 	$$ = build(O_EQ, $1, $3);
7509683Slinton }
7519683Slinton |
7529683Slinton     exp '=' '=' exp
7539683Slinton {
7549683Slinton 	$$ = build(O_EQ, $1, $4);
7559683Slinton }
7569683Slinton |
7579683Slinton     exp '<' '>' exp
7589683Slinton {
7599683Slinton 	$$ = build(O_NE, $1, $4);
7609683Slinton }
7619683Slinton |
7629683Slinton     exp '!' '=' exp
7639683Slinton {
7649683Slinton 	$$ = build(O_NE, $1, $4);
7659683Slinton }
7669683Slinton |
7679683Slinton     '(' exp ')'
7689683Slinton {
7699683Slinton 	$$ = $2;
7709683Slinton }
7719683Slinton ;
7729683Slinton term:
7739683Slinton     symbol
7749683Slinton {
7759683Slinton 	$$ = $1;
7769683Slinton }
7779683Slinton |
7789683Slinton     term '[' exp_list ']'
7799683Slinton {
7809683Slinton 	$$ = subscript($1, $3);
7819683Slinton }
7829683Slinton |
7839683Slinton     term '.' name
7849683Slinton {
7859683Slinton 	$$ = dot($1, $3);
7869683Slinton }
7879683Slinton |
7889683Slinton     term ARROW name
7899683Slinton {
7909683Slinton 	$$ = dot($1, $3);
7919683Slinton }
7929683Slinton |
7939683Slinton     '*' term %prec UNARYSIGN
7949683Slinton {
7959683Slinton 	$$ = build(O_INDIR, $2);
7969683Slinton }
7979683Slinton |
7989683Slinton     '*' '(' exp ')' %prec UNARYSIGN
7999683Slinton {
8009683Slinton 	$$ = build(O_INDIR, $3);
8019683Slinton }
8029683Slinton |
8039683Slinton     term '^' %prec UNARYSIGN
8049683Slinton {
8059683Slinton 	$$ = build(O_INDIR, $1);
8069683Slinton }
8079683Slinton |
8089683Slinton     '#' term %prec UNARYSIGN
8099683Slinton {
8109683Slinton 	$$ = concrete($2);
8119683Slinton }
8129683Slinton |
8139683Slinton     term '(' exp_list ')'
8149683Slinton {
8159683Slinton 	$$ = build(O_CALL, $1, $3);
8169683Slinton }
8179683Slinton ;
8189683Slinton boolean_exp:
8199683Slinton     exp
8209683Slinton {
8219683Slinton 	chkboolean($1);
8229683Slinton 	$$ = $1;
8239683Slinton }
8249683Slinton ;
8259683Slinton constant:
8269683Slinton     INT
8279683Slinton {
8289683Slinton 	$$ = build(O_LCON, $1);
8299683Slinton }
8309683Slinton |
8319683Slinton     REAL
8329683Slinton {
8339683Slinton 	$$ = build(O_FCON, $1);
8349683Slinton }
8359683Slinton |
8369683Slinton     STRING
8379683Slinton {
8389683Slinton 	$$ = build(O_SCON, $1);
8399683Slinton }
8409683Slinton ;
8419683Slinton symbol:
8429683Slinton     name
8439683Slinton {
8449683Slinton 	$$ = build(O_SYM, which($1));
8459683Slinton }
8469683Slinton ;
8479683Slinton name:
8489683Slinton     NAME
8499683Slinton {
8509683Slinton 	$$ = $1;
8519683Slinton }
8529683Slinton |
8539683Slinton     keyword
8549683Slinton {
8559683Slinton 	$$ = $1;
8569683Slinton }
8579683Slinton keyword:
8589683Slinton     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DELETE | DIV | DUMP |
8599683Slinton     EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
8609683Slinton     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
8619683Slinton     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
8629683Slinton     STOP | STOPI | TRACE | TRACEI |
8639683Slinton     USE | WHATIS | WHEN | WHERE | WHICH
8649683Slinton ;
865