xref: /csrg-svn/old/dbx/commands.y (revision 11173)
19683Slinton %{
29683Slinton 
39683Slinton /* Copyright (c) 1982 Regents of the University of California */
49683Slinton 
5*11173Slinton static char sccsid[] = "@(#)commands.y 1.3 02/20/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
41*11173Slinton %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 {
1439683Slinton 	$$ = build(O_CONT);
1449683Slinton }
1459683Slinton |
1469683Slinton     DELETE INT
1479683Slinton {
1489683Slinton 	$$ = build(O_DELETE, $2);
1499683Slinton }
1509683Slinton |
1519683Slinton     EDIT shellmode opt_filename
1529683Slinton {
1539683Slinton 	$$ = build(O_EDIT, $3);
1549683Slinton }
1559683Slinton |
1569683Slinton     FILE shellmode opt_filename
1579683Slinton {
1589683Slinton 	$$ = build(O_CHFILE, $3);
1599683Slinton }
1609683Slinton |
1619683Slinton     FUNC
1629683Slinton {
1639683Slinton 	$$ = build(O_FUNC, nil);
1649683Slinton }
1659683Slinton |
1669683Slinton     FUNC symbol
1679683Slinton {
1689683Slinton 	$$ = build(O_FUNC, $2);
1699683Slinton }
1709683Slinton |
1719683Slinton     GRIPE
1729683Slinton {
1739683Slinton 	$$ = build(O_GRIPE);
1749683Slinton }
1759683Slinton |
1769683Slinton     HELP
1779683Slinton {
1789683Slinton 	$$ = build(O_HELP);
1799683Slinton }
1809683Slinton |
1819683Slinton     IGNORE INT
1829683Slinton {
1839683Slinton 	$$ = build(O_IGNORE, $2);
1849683Slinton }
1859683Slinton |
1869683Slinton     list_command
1879683Slinton {
1889683Slinton 	$$ = $1;
1899683Slinton }
1909683Slinton |
1919683Slinton     PSYM term
1929683Slinton {
1939683Slinton 	$$ = build(O_PSYM, $2);
1949683Slinton }
1959683Slinton |
1969683Slinton     QUIT
1979683Slinton {
1989683Slinton 	if (not popinput()) {
1999683Slinton 	    quit(0);
2009683Slinton 	} else {
2019683Slinton 	    $$ = nil;
2029683Slinton 	}
2039683Slinton }
2049683Slinton |
2059683Slinton     runcommand
2069683Slinton {
2079683Slinton 	run();
2089683Slinton 	/* NOTREACHED */
2099683Slinton }
2109683Slinton |
2119683Slinton     SH
2129683Slinton {
2139683Slinton 	shellline();
2149683Slinton 	$$ = nil;
2159683Slinton }
2169683Slinton |
2179683Slinton     SOURCE shellmode filename
2189683Slinton {
2199683Slinton 	$$ = build(O_SOURCE, $3);
2209683Slinton }
2219683Slinton |
2229683Slinton     step
2239683Slinton {
2249683Slinton 	$$ = $1;
2259683Slinton }
2269683Slinton |
2279683Slinton     stop where opt_cond
2289683Slinton {
2299683Slinton 	$$ = build($1, nil, $2, $3);
2309683Slinton }
2319683Slinton |
2329683Slinton     stop what opt_cond
2339683Slinton {
2349683Slinton 	$$ = build($1, $2, nil, $3);
2359683Slinton }
2369683Slinton |
2379683Slinton     stop IF boolean_exp
2389683Slinton {
2399683Slinton 	$$ = build($1, nil, nil, $3);
2409683Slinton }
2419683Slinton |
2429683Slinton     trace what where opt_cond
2439683Slinton {
2449683Slinton 	$$ = build($1, $2, $3, $4);
2459683Slinton }
2469683Slinton |
2479683Slinton     trace where opt_cond
2489683Slinton {
2499683Slinton 	$$ = build($1, nil, $2, $3);
2509683Slinton }
2519683Slinton |
2529683Slinton     trace what opt_cond
2539683Slinton {
2549683Slinton 	$$ = build($1, $2, nil, $3);
2559683Slinton }
2569683Slinton |
2579683Slinton     trace opt_cond
2589683Slinton {
2599683Slinton 	$$ = build($1, nil, nil, $2);
2609683Slinton }
2619683Slinton |
2629683Slinton     WHATIS term
2639683Slinton {
2649683Slinton 	$$ = build(O_WHATIS, $2);
2659683Slinton }
2669683Slinton |
2679683Slinton     WHEN event '{' actions '}'
2689683Slinton {
2699683Slinton 	$$ = build(O_ADDEVENT, $2, $4);
2709683Slinton }
2719683Slinton |
2729683Slinton     WHEREIS symbol
2739683Slinton {
2749683Slinton 	$$ = build(O_WHEREIS, $2);
2759683Slinton }
2769683Slinton |
2779683Slinton     WHICH symbol
2789683Slinton {
2799683Slinton 	$$ = build(O_WHICH, $2);
2809683Slinton }
2819683Slinton |
2829683Slinton     USE shellmode sourcepath
2839683Slinton {
2849683Slinton 	$$ = nil;
2859683Slinton 	if (list_size(sourcepath) == 0) {
2869683Slinton 	    list_append(list_item("."), nil, sourcepath);
2879683Slinton 	}
2889683Slinton }
2899683Slinton ;
2909683Slinton runcommand:
2919683Slinton     run shellmode arglist
2929683Slinton ;
2939683Slinton run:
2949683Slinton     RUN
2959683Slinton {
2969683Slinton 	fflush(stdout);
2979683Slinton 	arginit();
2989683Slinton }
2999683Slinton ;
3009683Slinton arglist:
3019683Slinton     arglist arg
3029683Slinton |
3039683Slinton     /* empty */
3049683Slinton ;
3059683Slinton arg:
3069683Slinton     NAME
3079683Slinton {
3089683Slinton 	newarg(ident($1));
3099683Slinton }
3109683Slinton |
3119683Slinton     '<' NAME
3129683Slinton {
3139683Slinton 	inarg(ident($2));
3149683Slinton }
3159683Slinton |
3169683Slinton     '>' NAME
3179683Slinton {
3189683Slinton 	outarg(ident($2));
3199683Slinton }
3209683Slinton ;
3219683Slinton step:
3229683Slinton     STEP
3239683Slinton {
3249683Slinton 	$$ = build(O_STEP, true, false);
3259683Slinton }
3269683Slinton |
3279683Slinton     STEPI
3289683Slinton {
3299683Slinton 	$$ = build(O_STEP, false, false);
3309683Slinton }
3319683Slinton |
3329683Slinton     NEXT
3339683Slinton {
3349683Slinton 	$$ = build(O_STEP, true, true);
3359683Slinton }
3369683Slinton |
3379683Slinton     NEXTI
3389683Slinton {
3399683Slinton 	$$ = build(O_STEP, false, true);
3409683Slinton }
3419683Slinton ;
3429683Slinton shellmode:
3439683Slinton     /* empty */
3449683Slinton {
3459683Slinton 	beginshellmode();
3469683Slinton }
3479683Slinton ;
3489683Slinton sourcepath:
3499683Slinton     sourcepath NAME
3509683Slinton {
3519683Slinton 	list_append(list_item(ident($2)), nil, sourcepath);
3529683Slinton }
3539683Slinton |
3549683Slinton     /* empty */
3559683Slinton {
3569683Slinton 	String dir;
3579683Slinton 
3589683Slinton 	foreach (String, dir, sourcepath)
3599683Slinton 	    list_delete(list_curitem(sourcepath), sourcepath);
3609683Slinton 	endfor
3619683Slinton }
3629683Slinton ;
3639683Slinton event:
3649683Slinton     where
3659683Slinton |
3669683Slinton     exp
3679683Slinton ;
3689683Slinton actions:
3699683Slinton     actions cmd ';'
3709683Slinton {
3719683Slinton 	$$ = $1;
3729683Slinton 	cmdlist_append($2, $$);
3739683Slinton }
3749683Slinton |
3759683Slinton     cmd ';'
3769683Slinton {
3779683Slinton 	$$ = list_alloc();
3789683Slinton 	cmdlist_append($1, $$);
3799683Slinton }
3809683Slinton ;
3819683Slinton cmd:
3829683Slinton     command
3839683Slinton |
3849683Slinton     rcommand
3859683Slinton ;
3869683Slinton 
3879683Slinton /*
3889683Slinton  * Redirectable commands.
3899683Slinton  */
3909683Slinton rcommand:
3919683Slinton     PRINT exp_list
3929683Slinton {
3939683Slinton 	$$ = build(O_PRINT, $2);
3949683Slinton }
3959683Slinton |
3969683Slinton     WHERE
3979683Slinton {
3989683Slinton 	$$ = build(O_WHERE);
3999683Slinton }
4009683Slinton |
4019683Slinton     examine
4029683Slinton {
4039683Slinton 	$$ = $1;
4049683Slinton }
4059683Slinton |
4069683Slinton     CALL term
4079683Slinton {
4089683Slinton 	$$ = $2;
4099683Slinton }
4109683Slinton |
4119683Slinton     DUMP
4129683Slinton {
4139683Slinton 	$$ = build(O_DUMP);
4149683Slinton }
4159683Slinton |
4169683Slinton     STATUS
4179683Slinton {
4189683Slinton 	$$ = build(O_STATUS);
4199683Slinton }
4209683Slinton ;
4219683Slinton alias_command:
4229683Slinton     ALIAS name name
4239683Slinton {
4249683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3));
4259683Slinton }
4269683Slinton |
4279683Slinton     ALIAS name
4289683Slinton {
4299683Slinton 	$$ = build(O_ALIAS, build(O_NAME, $2), nil);
4309683Slinton }
4319683Slinton |
4329683Slinton     ALIAS
4339683Slinton {
4349683Slinton 	$$ = build(O_ALIAS, nil, nil);
4359683Slinton }
4369683Slinton ;
4379683Slinton trace:
4389683Slinton     TRACE
4399683Slinton {
4409683Slinton 	$$ = O_TRACE;
4419683Slinton }
4429683Slinton |
4439683Slinton     TRACEI
4449683Slinton {
4459683Slinton 	$$ = O_TRACEI;
4469683Slinton }
4479683Slinton ;
4489683Slinton stop:
4499683Slinton     STOP
4509683Slinton {
4519683Slinton 	$$ = O_STOP;
4529683Slinton }
4539683Slinton |
4549683Slinton     STOPI
4559683Slinton {
4569683Slinton 	$$ = O_STOPI;
4579683Slinton }
4589683Slinton ;
4599683Slinton what:
4609683Slinton     exp
4619683Slinton {
4629683Slinton 	$$ = $1;
4639683Slinton }
4649683Slinton |
4659683Slinton     STRING ':' line_number
4669683Slinton {
4679683Slinton 	$$ = build(O_QLINE, build(O_SCON, $1), $3);
4689683Slinton }
4699683Slinton ;
4709683Slinton where:
4719683Slinton     IN term
4729683Slinton {
4739683Slinton 	$$ = $2;
4749683Slinton }
4759683Slinton |
4769683Slinton     AT line_number
4779683Slinton {
4789683Slinton 	$$ = build(O_QLINE, build(O_SCON, cursource), $2);
4799683Slinton }
4809683Slinton |
4819683Slinton     AT STRING ':' line_number
4829683Slinton {
4839683Slinton 	$$ = build(O_QLINE, build(O_SCON, $2), $4);
4849683Slinton }
4859683Slinton ;
4869683Slinton filename:
4879683Slinton     NAME
4889683Slinton {
4899683Slinton 	$$ = ident($1);
4909683Slinton }
4919683Slinton ;
4929683Slinton opt_filename:
4939683Slinton     /* empty */
4949683Slinton {
4959683Slinton 	$$ = nil;
4969683Slinton }
4979683Slinton |
4989683Slinton     filename
4999683Slinton {
5009683Slinton 	$$ = $1;
5019683Slinton }
5029683Slinton ;
5039683Slinton opt_arglist:
5049683Slinton     /* empty */
5059683Slinton {
5069683Slinton 	$$ = nil;
5079683Slinton }
5089683Slinton |
5099683Slinton     '(' exp_list ')'
5109683Slinton {
5119683Slinton 	$$ = $2;
5129683Slinton }
5139683Slinton ;
5149683Slinton list_command:
5159683Slinton     LIST
5169683Slinton {
5179683Slinton 	$$ = build(O_LIST,
5189683Slinton 	    build(O_LCON, (long) cursrcline),
5199683Slinton 	    build(O_LCON, (long) cursrcline + 9)
5209683Slinton 	);
5219683Slinton }
5229683Slinton |
5239683Slinton     LIST line_number
5249683Slinton {
5259683Slinton 	$$ = build(O_LIST, $2, $2);
5269683Slinton }
5279683Slinton |
5289683Slinton     LIST line_number ',' line_number
5299683Slinton {
5309683Slinton 	$$ = build(O_LIST, $2, $4);
5319683Slinton }
5329683Slinton |
5339683Slinton     LIST symbol
5349683Slinton {
5359683Slinton 	$$ = build(O_LIST, $2);
5369683Slinton }
5379683Slinton ;
5389683Slinton line_number:
5399683Slinton     INT
5409683Slinton {
5419683Slinton 	$$ = build(O_LCON, $1);
5429683Slinton }
5439683Slinton |
5449683Slinton     '$'
5459683Slinton {
5469683Slinton 	$$ = build(O_LCON, (long) LASTLINE);
5479683Slinton }
5489683Slinton ;
5499683Slinton examine:
5509683Slinton     address '/' count mode
5519683Slinton {
5529683Slinton 	$$ = build(O_EXAMINE, $4, $1, nil, $3);
5539683Slinton }
5549683Slinton |
5559683Slinton     address ',' address '/' mode
5569683Slinton {
5579683Slinton 	$$ = build(O_EXAMINE, $5, $1, $3, 0);
5589683Slinton }
5599683Slinton |
5609683Slinton     '/' count mode
5619683Slinton {
5629683Slinton 	$$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2);
5639683Slinton }
564*11173Slinton |
565*11173Slinton     address '=' mode
566*11173Slinton {
567*11173Slinton 	$$ = build(O_EXAMINE, $3, $1, nil, 0);
568*11173Slinton }
5699683Slinton ;
5709683Slinton address:
5719683Slinton     INT
5729683Slinton {
5739683Slinton 	$$ = build(O_LCON, $1);
5749683Slinton }
5759683Slinton |
5769683Slinton     '&' term
5779683Slinton {
5789683Slinton 	$$ = amper($2);
5799683Slinton }
5809683Slinton |
5819683Slinton     address '+' address
5829683Slinton {
5839683Slinton 	$$ = build(O_ADD, $1, $3);
5849683Slinton }
5859683Slinton |
5869683Slinton     address '-' address
5879683Slinton {
5889683Slinton 	$$ = build(O_SUB, $1, $3);
5899683Slinton }
5909683Slinton |
5919683Slinton     address '*' address
5929683Slinton {
5939683Slinton 	$$ = build(O_MUL, $1, $3);
5949683Slinton }
5959683Slinton |
5969683Slinton     '*' address %prec UNARYSIGN
5979683Slinton {
5989683Slinton 	$$ = build(O_INDIR, $2);
5999683Slinton }
6009683Slinton |
6019683Slinton     '(' exp ')'
6029683Slinton {
6039683Slinton 	$$ = $2;
6049683Slinton }
6059683Slinton ;
6069683Slinton count:
6079683Slinton     /* empty */
6089683Slinton {
6099683Slinton 	$$ = 1;
6109683Slinton }
6119683Slinton |
6129683Slinton     INT
6139683Slinton {
6149683Slinton 	$$ = $1;
6159683Slinton }
6169683Slinton ;
6179683Slinton mode:
6189683Slinton     name
6199683Slinton {
6209683Slinton 	$$ = ident($1);
6219683Slinton 	curformat = $$;
6229683Slinton }
6239683Slinton |
6249683Slinton     /* empty */
6259683Slinton {
6269683Slinton 	$$ = curformat;
6279683Slinton }
6289683Slinton ;
6299683Slinton opt_cond:
6309683Slinton     /* empty */
6319683Slinton {
6329683Slinton 	$$ = nil;
6339683Slinton }
6349683Slinton |
6359683Slinton     IF boolean_exp
6369683Slinton {
6379683Slinton 	$$ = $2;
6389683Slinton }
6399683Slinton ;
6409683Slinton exp_list:
6419683Slinton     exp
6429683Slinton {
6439683Slinton 	$$ = build(O_COMMA, $1, nil);
6449683Slinton }
6459683Slinton |
6469683Slinton     exp ',' exp_list
6479683Slinton {
6489683Slinton 	$$ = build(O_COMMA, $1, $3);
6499683Slinton }
6509683Slinton ;
6519683Slinton exp:
6529683Slinton     term
6539683Slinton {
6549683Slinton 	$$ = build(O_RVAL, $1);
6559683Slinton }
6569683Slinton |
6579683Slinton     constant
6589683Slinton {
6599683Slinton 	$$ = $1;
6609683Slinton }
6619683Slinton |
662*11173Slinton     exp '\\' symbol
663*11173Slinton {
664*11173Slinton 	$$ = build(O_TYPERENAME, $1, $3);
665*11173Slinton }
666*11173Slinton |
6679683Slinton     '+' exp %prec UNARYSIGN
6689683Slinton {
6699683Slinton 	$$ = $2;
6709683Slinton }
6719683Slinton |
6729683Slinton     '-' exp %prec UNARYSIGN
6739683Slinton {
6749683Slinton 	$$ = build(O_NEG, $2);
6759683Slinton }
6769683Slinton |
6779683Slinton     '&' exp %prec UNARYSIGN
6789683Slinton {
6799683Slinton 	$$ = amper($2);
6809683Slinton }
6819683Slinton |
6829683Slinton     exp '+' exp
6839683Slinton {
6849683Slinton 	$$ = build(O_ADD, $1, $3);
6859683Slinton }
6869683Slinton |
6879683Slinton     exp '-' exp
6889683Slinton {
6899683Slinton 	$$ = build(O_SUB, $1, $3);
6909683Slinton }
6919683Slinton |
6929683Slinton     exp '*' exp
6939683Slinton {
6949683Slinton 	$$ = build(O_MUL, $1, $3);
6959683Slinton }
6969683Slinton |
6979683Slinton     exp '/' exp
6989683Slinton {
6999683Slinton 	$$ = build(O_DIVF, $1, $3);
7009683Slinton }
7019683Slinton |
7029683Slinton     exp DIV exp
7039683Slinton {
7049683Slinton 	$$ = build(O_DIV, $1, $3);
7059683Slinton }
7069683Slinton |
7079683Slinton     exp MOD exp
7089683Slinton {
7099683Slinton 	$$ = build(O_MOD, $1, $3);
7109683Slinton }
7119683Slinton |
7129683Slinton     exp AND exp
7139683Slinton {
7149683Slinton 	$$ = build(O_AND, $1, $3);
7159683Slinton }
7169683Slinton |
7179683Slinton     exp OR exp
7189683Slinton {
7199683Slinton 	$$ = build(O_OR, $1, $3);
7209683Slinton }
7219683Slinton |
7229683Slinton     exp '<' exp
7239683Slinton {
7249683Slinton 	$$ = build(O_LT, $1, $3);
7259683Slinton }
7269683Slinton |
7279683Slinton     exp '<' '=' exp
7289683Slinton {
7299683Slinton 	$$ = build(O_LE, $1, $4);
7309683Slinton }
7319683Slinton |
7329683Slinton     exp '>' exp
7339683Slinton {
7349683Slinton 	$$ = build(O_GT, $1, $3);
7359683Slinton }
7369683Slinton |
7379683Slinton     exp '>' '=' exp
7389683Slinton {
7399683Slinton 	$$ = build(O_GE, $1, $4);
7409683Slinton }
7419683Slinton |
7429683Slinton     exp '=' exp
7439683Slinton {
7449683Slinton 	$$ = build(O_EQ, $1, $3);
7459683Slinton }
7469683Slinton |
7479683Slinton     exp '=' '=' exp
7489683Slinton {
7499683Slinton 	$$ = build(O_EQ, $1, $4);
7509683Slinton }
7519683Slinton |
7529683Slinton     exp '<' '>' exp
7539683Slinton {
7549683Slinton 	$$ = build(O_NE, $1, $4);
7559683Slinton }
7569683Slinton |
7579683Slinton     exp '!' '=' exp
7589683Slinton {
7599683Slinton 	$$ = build(O_NE, $1, $4);
7609683Slinton }
7619683Slinton |
7629683Slinton     '(' exp ')'
7639683Slinton {
7649683Slinton 	$$ = $2;
7659683Slinton }
7669683Slinton ;
7679683Slinton term:
7689683Slinton     symbol
7699683Slinton {
7709683Slinton 	$$ = $1;
7719683Slinton }
7729683Slinton |
7739683Slinton     term '[' exp_list ']'
7749683Slinton {
7759683Slinton 	$$ = subscript($1, $3);
7769683Slinton }
7779683Slinton |
7789683Slinton     term '.' name
7799683Slinton {
7809683Slinton 	$$ = dot($1, $3);
7819683Slinton }
7829683Slinton |
7839683Slinton     term ARROW name
7849683Slinton {
7859683Slinton 	$$ = dot($1, $3);
7869683Slinton }
7879683Slinton |
7889683Slinton     '*' term %prec UNARYSIGN
7899683Slinton {
7909683Slinton 	$$ = build(O_INDIR, $2);
7919683Slinton }
7929683Slinton |
7939683Slinton     '*' '(' exp ')' %prec UNARYSIGN
7949683Slinton {
7959683Slinton 	$$ = build(O_INDIR, $3);
7969683Slinton }
7979683Slinton |
7989683Slinton     term '^' %prec UNARYSIGN
7999683Slinton {
8009683Slinton 	$$ = build(O_INDIR, $1);
8019683Slinton }
8029683Slinton |
8039683Slinton     '#' term %prec UNARYSIGN
8049683Slinton {
8059683Slinton 	$$ = concrete($2);
8069683Slinton }
8079683Slinton |
8089683Slinton     term '(' exp_list ')'
8099683Slinton {
8109683Slinton 	$$ = build(O_CALL, $1, $3);
8119683Slinton }
8129683Slinton ;
8139683Slinton boolean_exp:
8149683Slinton     exp
8159683Slinton {
8169683Slinton 	chkboolean($1);
8179683Slinton 	$$ = $1;
8189683Slinton }
8199683Slinton ;
8209683Slinton constant:
8219683Slinton     INT
8229683Slinton {
8239683Slinton 	$$ = build(O_LCON, $1);
8249683Slinton }
8259683Slinton |
8269683Slinton     REAL
8279683Slinton {
8289683Slinton 	$$ = build(O_FCON, $1);
8299683Slinton }
8309683Slinton |
8319683Slinton     STRING
8329683Slinton {
8339683Slinton 	$$ = build(O_SCON, $1);
8349683Slinton }
8359683Slinton ;
8369683Slinton symbol:
8379683Slinton     name
8389683Slinton {
8399683Slinton 	$$ = build(O_SYM, which($1));
8409683Slinton }
8419683Slinton ;
8429683Slinton name:
8439683Slinton     NAME
8449683Slinton {
8459683Slinton 	$$ = $1;
8469683Slinton }
8479683Slinton |
8489683Slinton     keyword
8499683Slinton {
8509683Slinton 	$$ = $1;
8519683Slinton }
8529683Slinton keyword:
8539683Slinton     ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DELETE | DIV | DUMP |
8549683Slinton     EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD |
8559683Slinton     NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN |
8569683Slinton     SH | SKIP | SOURCE | STATUS | STEP | STEPI |
8579683Slinton     STOP | STOPI | TRACE | TRACEI |
8589683Slinton     USE | WHATIS | WHEN | WHERE | WHICH
8599683Slinton ;
860