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