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