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