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