19683Slinton %{ 29683Slinton /* Copyright (c) 1982 Regents of the University of California */ 39683Slinton 4*16926Ssam static char sccsid[] = "@(#)commands.y 1.12 (Berkeley) 08/12/84"; 59683Slinton 69683Slinton /* 79683Slinton * Yacc grammar for debugger commands. 89683Slinton */ 99683Slinton 109683Slinton #include "defs.h" 119683Slinton #include "symbols.h" 129683Slinton #include "operators.h" 139683Slinton #include "tree.h" 149683Slinton #include "process.h" 159683Slinton #include "source.h" 169683Slinton #include "scanner.h" 179683Slinton #include "names.h" 1814673Slinton #include "lists.h" 19*16926Ssam #include <signal.h> 209683Slinton 219683Slinton private String curformat = "X"; 229683Slinton 239683Slinton %} 249683Slinton 259683Slinton %term 2616607Ssam ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP 279683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 2816607Ssam PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS STEP STEPI 2916607Ssam STOP STOPI TRACE TRACEI UP 309683Slinton USE WHATIS WHEN WHERE WHEREIS WHICH 319683Slinton 329683Slinton %term INT REAL NAME STRING 339683Slinton %term LFORMER RFORMER ABSTRACTION ARROW 349683Slinton 359683Slinton %right INT 369683Slinton %binary REDIRECT 379683Slinton %binary '<' '=' '>' '!' IN 389683Slinton %left '+' '-' OR 399683Slinton %left UNARYSIGN 409683Slinton %left '*' '/' DIV MOD AND 419683Slinton %left NOT '(' '[' '.' '^' ARROW 4211173Slinton %left '\\' 439683Slinton 449683Slinton %union { 459683Slinton Name y_name; 469683Slinton Symbol y_sym; 479683Slinton Node y_node; 489683Slinton Integer y_int; 499683Slinton Operator y_op; 509683Slinton long y_long; 519683Slinton double y_real; 529683Slinton String y_string; 539683Slinton Boolean y_bool; 549683Slinton Cmdlist y_cmdlist; 5514673Slinton List y_list; 569683Slinton }; 579683Slinton 589683Slinton %type <y_op> trace stop 599683Slinton %type <y_long> INT count 609683Slinton %type <y_real> REAL 619683Slinton %type <y_string> STRING redirectout filename opt_filename mode 6216607Ssam %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT 6316607Ssam %type <y_name> DEBUG DELETE DIV DOWN DUMP 649683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 659683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 6616607Ssam %type <y_name> PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS 6716607Ssam %type <y_name> STEP STEPI STOP STOPI TRACE TRACEI 6816607Ssam %type <y_name> UP USE WHATIS WHEN WHERE WHEREIS WHICH 699683Slinton %type <y_name> name NAME keyword 7016607Ssam %type <y_node> opt_qual_symbol symbol 719683Slinton %type <y_node> command rcommand cmd step what where examine 7212482Slinton %type <y_node> event opt_exp_list opt_cond 739683Slinton %type <y_node> exp_list exp term boolean_exp constant address 74*16926Ssam %type <y_node> int_list alias_command list_command line_number 75*16926Ssam %type <y_node> something search_command pattern 76*16926Ssam %type <y_node> signal_list signal 779683Slinton %type <y_cmdlist> actions 7814673Slinton %type <y_list> sourcepath 799683Slinton 809683Slinton %% 819683Slinton 829683Slinton input: 839683Slinton input command_nl 84*16926Ssam { 85*16926Ssam endshellmode(); 86*16926Ssam startaliasing(); 87*16926Ssam } 889683Slinton | 899683Slinton /* empty */ 909683Slinton ; 91*16926Ssam 929683Slinton command_nl: 939683Slinton command_line '\n' 94*16926Ssam { 95*16926Ssam if (istty()) { 96*16926Ssam printf("(%s) ", cmdname); 97*16926Ssam fflush(stdout); 98*16926Ssam } 99*16926Ssam } 1009683Slinton | 1019683Slinton command_line ';' 1029683Slinton | 1039683Slinton '\n' 104*16926Ssam { 105*16926Ssam if (istty()) { 106*16926Ssam printf("(%s) ", cmdname); 107*16926Ssam fflush(stdout); 108*16926Ssam } 109*16926Ssam } 1109683Slinton ; 1119683Slinton 1129683Slinton command_line: 1139683Slinton command 1149683Slinton { 1159683Slinton if ($1 != nil) { 11612536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1179683Slinton eval($1); 1189683Slinton } 119*16926Ssam startaliasing(); 1209683Slinton } 1219683Slinton | 1229683Slinton rcommand redirectout 1239683Slinton { 1249683Slinton if ($1 != nil) { 1259683Slinton if ($2 != nil) { 1269683Slinton setout($2); 12712536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1289683Slinton eval($1); 1299683Slinton unsetout(); 1309683Slinton } else { 13112536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1329683Slinton eval($1); 1339683Slinton } 1349683Slinton } 135*16926Ssam startaliasing(); 1369683Slinton } 1379683Slinton ; 1389683Slinton redirectout: 1399683Slinton '>' shellmode NAME 1409683Slinton { 1419683Slinton $$ = ident($3); 1429683Slinton } 1439683Slinton | 1449683Slinton /* empty */ 1459683Slinton { 1469683Slinton $$ = nil; 1479683Slinton } 1489683Slinton ; 1499683Slinton 1509683Slinton /* 1519683Slinton * Non-redirectable commands. 1529683Slinton */ 1539683Slinton command: 1549683Slinton alias_command 1559683Slinton { 1569683Slinton $$ = $1; 1579683Slinton } 1589683Slinton | 159*16926Ssam ASSIGN stopaliasing term '=' exp 1609683Slinton { 161*16926Ssam $$ = build(O_ASSIGN, $3, $5); 1629683Slinton } 1639683Slinton | 164*16926Ssam CATCH 1659683Slinton { 166*16926Ssam $$ = build(O_CATCH, nil); 1679683Slinton } 1689683Slinton | 169*16926Ssam CATCH stopaliasing signal_list 170*16926Ssam { 171*16926Ssam $$ = build(O_CATCH, $3); 172*16926Ssam } 173*16926Ssam | 1749683Slinton CONT 1759683Slinton { 17614673Slinton $$ = build(O_CONT, (long) DEFSIG); 1779683Slinton } 1789683Slinton | 17911870Slinton CONT INT 18011870Slinton { 18111870Slinton $$ = build(O_CONT, $2); 18211870Slinton } 18311870Slinton | 184*16926Ssam DELETE int_list 1859683Slinton { 1869683Slinton $$ = build(O_DELETE, $2); 1879683Slinton } 1889683Slinton | 18916607Ssam DOWN 19016607Ssam { 19116607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 19216607Ssam } 19316607Ssam | 19416607Ssam DOWN INT 19516607Ssam { 19616607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 19716607Ssam } 19816607Ssam | 1999683Slinton EDIT shellmode opt_filename 2009683Slinton { 2019683Slinton $$ = build(O_EDIT, $3); 2029683Slinton } 2039683Slinton | 2049683Slinton FILE shellmode opt_filename 2059683Slinton { 2069683Slinton $$ = build(O_CHFILE, $3); 2079683Slinton } 2089683Slinton | 2099683Slinton FUNC 2109683Slinton { 2119683Slinton $$ = build(O_FUNC, nil); 2129683Slinton } 2139683Slinton | 214*16926Ssam FUNC stopaliasing symbol 2159683Slinton { 216*16926Ssam $$ = build(O_FUNC, $3); 2179683Slinton } 2189683Slinton | 2199683Slinton GRIPE 2209683Slinton { 2219683Slinton $$ = build(O_GRIPE); 2229683Slinton } 2239683Slinton | 2249683Slinton HELP 2259683Slinton { 2269683Slinton $$ = build(O_HELP); 2279683Slinton } 2289683Slinton | 229*16926Ssam IGNORE 2309683Slinton { 231*16926Ssam $$ = build(O_IGNORE, nil); 2329683Slinton } 2339683Slinton | 234*16926Ssam IGNORE stopaliasing signal_list 235*16926Ssam { 236*16926Ssam $$ = build(O_IGNORE, $3); 237*16926Ssam } 238*16926Ssam | 2399683Slinton list_command 2409683Slinton { 2419683Slinton $$ = $1; 2429683Slinton } 2439683Slinton | 244*16926Ssam PSYM stopaliasing term 2459683Slinton { 246*16926Ssam $$ = build(O_PSYM, $3); 2479683Slinton } 2489683Slinton | 2499683Slinton QUIT 2509683Slinton { 2519683Slinton if (not popinput()) { 2529683Slinton quit(0); 2539683Slinton } else { 2549683Slinton $$ = nil; 2559683Slinton } 2569683Slinton } 2579683Slinton | 25816607Ssam RETURN 25916607Ssam { 26016607Ssam $$ = build(O_RETURN, nil); 26116607Ssam } 26216607Ssam | 263*16926Ssam RETURN stopaliasing opt_qual_symbol 26416607Ssam { 265*16926Ssam $$ = build(O_RETURN, $3); 26616607Ssam } 26716607Ssam | 2689683Slinton runcommand 2699683Slinton { 2709683Slinton run(); 2719683Slinton /* NOTREACHED */ 2729683Slinton } 2739683Slinton | 2749683Slinton SH 2759683Slinton { 2769683Slinton shellline(); 2779683Slinton $$ = nil; 2789683Slinton } 2799683Slinton | 2809683Slinton SOURCE shellmode filename 2819683Slinton { 2829683Slinton $$ = build(O_SOURCE, $3); 2839683Slinton } 2849683Slinton | 2859683Slinton step 2869683Slinton { 2879683Slinton $$ = $1; 2889683Slinton } 2899683Slinton | 2909683Slinton stop where opt_cond 2919683Slinton { 2929683Slinton $$ = build($1, nil, $2, $3); 2939683Slinton } 2949683Slinton | 2959683Slinton stop what opt_cond 2969683Slinton { 2979683Slinton $$ = build($1, $2, nil, $3); 2989683Slinton } 2999683Slinton | 3009683Slinton stop IF boolean_exp 3019683Slinton { 3029683Slinton $$ = build($1, nil, nil, $3); 3039683Slinton } 3049683Slinton | 3059683Slinton trace what where opt_cond 3069683Slinton { 3079683Slinton $$ = build($1, $2, $3, $4); 3089683Slinton } 3099683Slinton | 3109683Slinton trace where opt_cond 3119683Slinton { 3129683Slinton $$ = build($1, nil, $2, $3); 3139683Slinton } 3149683Slinton | 3159683Slinton trace what opt_cond 3169683Slinton { 3179683Slinton $$ = build($1, $2, nil, $3); 3189683Slinton } 3199683Slinton | 3209683Slinton trace opt_cond 3219683Slinton { 3229683Slinton $$ = build($1, nil, nil, $2); 3239683Slinton } 3249683Slinton | 32516607Ssam UP 3269683Slinton { 32716607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 3289683Slinton } 3299683Slinton | 33016607Ssam UP INT 3319683Slinton { 33216607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3339683Slinton } 3349683Slinton | 3359683Slinton USE shellmode sourcepath 3369683Slinton { 33714673Slinton String dir; 33814673Slinton 3399683Slinton $$ = nil; 34014673Slinton if (list_size($3) == 0) { 34114673Slinton foreach (String, dir, sourcepath) 34214673Slinton printf("%s ", dir); 34314673Slinton endfor 34414673Slinton printf("\n"); 34514673Slinton } else { 34614673Slinton foreach (String, dir, sourcepath) 34714673Slinton list_delete(list_curitem(sourcepath), sourcepath); 34814673Slinton endfor 34914673Slinton sourcepath = $3; 3509683Slinton } 3519683Slinton } 35216604Ssam | 35316607Ssam WHATIS term 35416604Ssam { 35516607Ssam $$ = build(O_WHATIS, $2); 35616604Ssam } 35716607Ssam | 35816607Ssam WHEN event '{' actions '}' 35916604Ssam { 36016607Ssam $$ = build(O_ADDEVENT, $2, $4); 36116604Ssam } 36216604Ssam | 36316607Ssam WHEREIS symbol 36416604Ssam { 36516607Ssam $$ = build(O_WHEREIS, $2); 36616604Ssam } 36716607Ssam | 36816607Ssam WHICH symbol 36916604Ssam { 37016607Ssam $$ = build(O_WHICH, $2); 37116604Ssam } 37216625Ssam | 37316625Ssam search_command 37416625Ssam { 37516625Ssam $$ = $1; 37616625Ssam } 37716604Ssam ; 37816625Ssam 37916625Ssam 38016625Ssam search_command: 38116625Ssam '/' pattern 38216625Ssam { 38316625Ssam $$ = build(O_SEARCH, build(O_LCON, 1), $2); 38416625Ssam } 38516625Ssam | 38616625Ssam '?' pattern 38716625Ssam { 38816625Ssam $$ = build(O_SEARCH, build(O_LCON, 0), $2); 38916625Ssam } 39016625Ssam ; 39116625Ssam 39216625Ssam pattern: 39316625Ssam STRING 39416625Ssam { 39516625Ssam $$ = build(O_SCON, $1); 39616625Ssam } 39716625Ssam ; 39816625Ssam 399*16926Ssam int_list: 400*16926Ssam INT 401*16926Ssam { 402*16926Ssam $$ = build(O_COMMA, build(O_LCON, $1), nil); 403*16926Ssam } 404*16926Ssam | 405*16926Ssam INT int_list 406*16926Ssam { 407*16926Ssam $$ = build(O_COMMA, build(O_LCON, $1), $2); 408*16926Ssam } 409*16926Ssam ; 410*16926Ssam 411*16926Ssam signal_list: 412*16926Ssam signal 413*16926Ssam { 414*16926Ssam $$ = build(O_COMMA, $1, nil); 415*16926Ssam } 416*16926Ssam | 417*16926Ssam signal signal_list 418*16926Ssam { 419*16926Ssam $$ = build(O_COMMA, $1, $2); 420*16926Ssam } 421*16926Ssam ; 422*16926Ssam 423*16926Ssam signal: 424*16926Ssam INT 425*16926Ssam { 426*16926Ssam if ($1 < 1 || $1 > NSIG) 427*16926Ssam error("Invalid signal %d.", $1); 428*16926Ssam $$ = build(O_LCON, $1); 429*16926Ssam } 430*16926Ssam | 431*16926Ssam NAME 432*16926Ssam { 433*16926Ssam $$ = build(O_LCON, signalname(ident($1))); 434*16926Ssam } 435*16926Ssam ; 436*16926Ssam 4379683Slinton runcommand: 43816607Ssam run arglist 43912482Slinton | 44012524Slinton run 4419683Slinton ; 442*16926Ssam 4439683Slinton run: 44412524Slinton RUN shellmode 4459683Slinton { 44616607Ssam arginit(); 4479683Slinton fflush(stdout); 4489683Slinton } 44916607Ssam | 45016607Ssam RERUN shellmode 45116607Ssam { 45216607Ssam fflush(stdout); 45316607Ssam } 4549683Slinton ; 4559683Slinton arglist: 4569683Slinton arglist arg 4579683Slinton | 45812482Slinton arg 4599683Slinton ; 4609683Slinton arg: 461*16926Ssam NAME 4629683Slinton { 4639683Slinton newarg(ident($1)); 4649683Slinton } 4659683Slinton | 466*16926Ssam STRING 46716607Ssam { 46816607Ssam newarg($1); 46916607Ssam } 47016607Ssam | 4719683Slinton '<' NAME 4729683Slinton { 4739683Slinton inarg(ident($2)); 4749683Slinton } 4759683Slinton | 4769683Slinton '>' NAME 4779683Slinton { 4789683Slinton outarg(ident($2)); 4799683Slinton } 4809683Slinton ; 4819683Slinton step: 482*16926Ssam STEP stopaliasing 4839683Slinton { 4849683Slinton $$ = build(O_STEP, true, false); 4859683Slinton } 4869683Slinton | 487*16926Ssam STEPI stopaliasing 4889683Slinton { 4899683Slinton $$ = build(O_STEP, false, false); 4909683Slinton } 4919683Slinton | 492*16926Ssam NEXT stopaliasing 4939683Slinton { 4949683Slinton $$ = build(O_STEP, true, true); 4959683Slinton } 4969683Slinton | 497*16926Ssam NEXTI stopaliasing 4989683Slinton { 4999683Slinton $$ = build(O_STEP, false, true); 5009683Slinton } 5019683Slinton ; 5029683Slinton shellmode: 5039683Slinton /* empty */ 5049683Slinton { 5059683Slinton beginshellmode(); 5069683Slinton } 5079683Slinton ; 5089683Slinton sourcepath: 5099683Slinton sourcepath NAME 5109683Slinton { 51114673Slinton $$ = $1; 51214673Slinton list_append(list_item(ident($2)), nil, $$); 5139683Slinton } 5149683Slinton | 5159683Slinton /* empty */ 5169683Slinton { 51714673Slinton $$ = list_alloc(); 5189683Slinton } 5199683Slinton ; 5209683Slinton event: 5219683Slinton where 5229683Slinton | 5239683Slinton exp 5249683Slinton ; 5259683Slinton actions: 5269683Slinton actions cmd ';' 5279683Slinton { 5289683Slinton $$ = $1; 5299683Slinton cmdlist_append($2, $$); 5309683Slinton } 5319683Slinton | 5329683Slinton cmd ';' 5339683Slinton { 5349683Slinton $$ = list_alloc(); 5359683Slinton cmdlist_append($1, $$); 5369683Slinton } 5379683Slinton ; 5389683Slinton cmd: 5399683Slinton command 5409683Slinton | 5419683Slinton rcommand 5429683Slinton ; 5439683Slinton 5449683Slinton /* 5459683Slinton * Redirectable commands. 5469683Slinton */ 5479683Slinton rcommand: 548*16926Ssam PRINT stopaliasing exp_list 5499683Slinton { 550*16926Ssam $$ = build(O_PRINT, $3); 5519683Slinton } 5529683Slinton | 5539683Slinton WHERE 5549683Slinton { 5559683Slinton $$ = build(O_WHERE); 5569683Slinton } 5579683Slinton | 5589683Slinton examine 5599683Slinton { 5609683Slinton $$ = $1; 5619683Slinton } 5629683Slinton | 563*16926Ssam CALL stopaliasing term '(' opt_exp_list ')' 5649683Slinton { 565*16926Ssam $$ = build(O_CALL, $3, $5); 5669683Slinton } 5679683Slinton | 56812536Scsvaf DEBUG INT 56912536Scsvaf { 57012536Scsvaf $$ = build(O_DEBUG, $2); 57112536Scsvaf } 57212536Scsvaf | 5739683Slinton DUMP 5749683Slinton { 5759683Slinton $$ = build(O_DUMP); 5769683Slinton } 5779683Slinton | 5789683Slinton STATUS 5799683Slinton { 5809683Slinton $$ = build(O_STATUS); 5819683Slinton } 5829683Slinton ; 5839683Slinton alias_command: 584*16926Ssam alias name something 5859683Slinton { 586*16926Ssam $$ = build(O_ALIAS, build(O_NAME, $2), $3); 5879683Slinton } 5889683Slinton | 589*16926Ssam alias name 5909683Slinton { 5919683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 5929683Slinton } 5939683Slinton | 594*16926Ssam alias 5959683Slinton { 5969683Slinton $$ = build(O_ALIAS, nil, nil); 5979683Slinton } 5989683Slinton ; 599*16926Ssam 600*16926Ssam alias: 601*16926Ssam ALIAS stopaliasing 602*16926Ssam ; 603*16926Ssam 604*16926Ssam stopaliasing: 605*16926Ssam /* empty */ 606*16926Ssam { 607*16926Ssam stopaliasing(); 608*16926Ssam } 609*16926Ssam ; 610*16926Ssam 6119683Slinton trace: 612*16926Ssam TRACE stopaliasing 6139683Slinton { 6149683Slinton $$ = O_TRACE; 6159683Slinton } 6169683Slinton | 617*16926Ssam TRACEI stopaliasing 6189683Slinton { 6199683Slinton $$ = O_TRACEI; 6209683Slinton } 6219683Slinton ; 6229683Slinton stop: 623*16926Ssam STOP stopaliasing 6249683Slinton { 6259683Slinton $$ = O_STOP; 6269683Slinton } 6279683Slinton | 628*16926Ssam STOPI stopaliasing 6299683Slinton { 6309683Slinton $$ = O_STOPI; 6319683Slinton } 6329683Slinton ; 6339683Slinton what: 6349683Slinton exp 6359683Slinton { 6369683Slinton $$ = $1; 6379683Slinton } 6389683Slinton | 6399683Slinton STRING ':' line_number 6409683Slinton { 6419683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 6429683Slinton } 6439683Slinton ; 6449683Slinton where: 6459683Slinton IN term 6469683Slinton { 6479683Slinton $$ = $2; 6489683Slinton } 6499683Slinton | 6509683Slinton AT line_number 6519683Slinton { 6529683Slinton $$ = build(O_QLINE, build(O_SCON, cursource), $2); 6539683Slinton } 6549683Slinton | 6559683Slinton AT STRING ':' line_number 6569683Slinton { 6579683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 6589683Slinton } 6599683Slinton ; 6609683Slinton filename: 6619683Slinton NAME 6629683Slinton { 6639683Slinton $$ = ident($1); 6649683Slinton } 6659683Slinton ; 6669683Slinton opt_filename: 6679683Slinton /* empty */ 6689683Slinton { 6699683Slinton $$ = nil; 6709683Slinton } 6719683Slinton | 6729683Slinton filename 6739683Slinton { 6749683Slinton $$ = $1; 6759683Slinton } 6769683Slinton ; 67712482Slinton opt_exp_list: 67812482Slinton exp_list 6799683Slinton { 68012482Slinton $$ = $1; 6819683Slinton } 6829683Slinton | 68312482Slinton /* empty */ 6849683Slinton { 68512482Slinton $$ = nil; 6869683Slinton } 6879683Slinton ; 6889683Slinton list_command: 689*16926Ssam list 6909683Slinton { 6919683Slinton $$ = build(O_LIST, 6929683Slinton build(O_LCON, (long) cursrcline), 6939683Slinton build(O_LCON, (long) cursrcline + 9) 6949683Slinton ); 6959683Slinton } 6969683Slinton | 697*16926Ssam list line_number 6989683Slinton { 6999683Slinton $$ = build(O_LIST, $2, $2); 7009683Slinton } 7019683Slinton | 702*16926Ssam list line_number ',' line_number 7039683Slinton { 7049683Slinton $$ = build(O_LIST, $2, $4); 7059683Slinton } 7069683Slinton | 707*16926Ssam list symbol 7089683Slinton { 709*16926Ssam $$ = build(O_LIST, $2, nil); 7109683Slinton } 7119683Slinton ; 712*16926Ssam 713*16926Ssam list: 714*16926Ssam LIST stopaliasing 71516607Ssam ; 716*16926Ssam 7179683Slinton line_number: 7189683Slinton INT 7199683Slinton { 7209683Slinton $$ = build(O_LCON, $1); 7219683Slinton } 7229683Slinton | 7239683Slinton '$' 7249683Slinton { 7259683Slinton $$ = build(O_LCON, (long) LASTLINE); 7269683Slinton } 7279683Slinton ; 7289683Slinton examine: 7299683Slinton address '/' count mode 7309683Slinton { 7319683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 7329683Slinton } 7339683Slinton | 7349683Slinton address ',' address '/' mode 7359683Slinton { 7369683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 7379683Slinton } 7389683Slinton | 7399683Slinton '/' count mode 7409683Slinton { 7419683Slinton $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2); 7429683Slinton } 74311173Slinton | 74411173Slinton address '=' mode 74511173Slinton { 74611173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 74711173Slinton } 7489683Slinton ; 7499683Slinton address: 7509683Slinton INT 7519683Slinton { 7529683Slinton $$ = build(O_LCON, $1); 7539683Slinton } 7549683Slinton | 7559683Slinton '&' term 7569683Slinton { 7579683Slinton $$ = amper($2); 7589683Slinton } 7599683Slinton | 7609683Slinton address '+' address 7619683Slinton { 7629683Slinton $$ = build(O_ADD, $1, $3); 7639683Slinton } 7649683Slinton | 7659683Slinton address '-' address 7669683Slinton { 7679683Slinton $$ = build(O_SUB, $1, $3); 7689683Slinton } 7699683Slinton | 7709683Slinton address '*' address 7719683Slinton { 7729683Slinton $$ = build(O_MUL, $1, $3); 7739683Slinton } 7749683Slinton | 7759683Slinton '*' address %prec UNARYSIGN 7769683Slinton { 7779683Slinton $$ = build(O_INDIR, $2); 7789683Slinton } 7799683Slinton | 7809683Slinton '(' exp ')' 7819683Slinton { 7829683Slinton $$ = $2; 7839683Slinton } 7849683Slinton ; 7859683Slinton count: 7869683Slinton /* empty */ 7879683Slinton { 7889683Slinton $$ = 1; 7899683Slinton } 7909683Slinton | 7919683Slinton INT 7929683Slinton { 7939683Slinton $$ = $1; 7949683Slinton } 7959683Slinton ; 7969683Slinton mode: 7979683Slinton name 7989683Slinton { 7999683Slinton $$ = ident($1); 8009683Slinton curformat = $$; 8019683Slinton } 8029683Slinton | 8039683Slinton /* empty */ 8049683Slinton { 8059683Slinton $$ = curformat; 8069683Slinton } 8079683Slinton ; 8089683Slinton opt_cond: 8099683Slinton /* empty */ 8109683Slinton { 8119683Slinton $$ = nil; 8129683Slinton } 8139683Slinton | 8149683Slinton IF boolean_exp 8159683Slinton { 8169683Slinton $$ = $2; 8179683Slinton } 8189683Slinton ; 8199683Slinton exp_list: 8209683Slinton exp 8219683Slinton { 8229683Slinton $$ = build(O_COMMA, $1, nil); 8239683Slinton } 8249683Slinton | 8259683Slinton exp ',' exp_list 8269683Slinton { 8279683Slinton $$ = build(O_COMMA, $1, $3); 8289683Slinton } 8299683Slinton ; 8309683Slinton exp: 8319683Slinton term 8329683Slinton { 8339683Slinton $$ = build(O_RVAL, $1); 8349683Slinton } 8359683Slinton | 8369683Slinton constant 8379683Slinton { 8389683Slinton $$ = $1; 8399683Slinton } 8409683Slinton | 84116607Ssam exp '\\' opt_qual_symbol 84211173Slinton { 84311173Slinton $$ = build(O_TYPERENAME, $1, $3); 84411173Slinton } 84511173Slinton | 8469683Slinton '+' exp %prec UNARYSIGN 8479683Slinton { 8489683Slinton $$ = $2; 8499683Slinton } 8509683Slinton | 8519683Slinton '-' exp %prec UNARYSIGN 8529683Slinton { 8539683Slinton $$ = build(O_NEG, $2); 8549683Slinton } 8559683Slinton | 8569683Slinton '&' exp %prec UNARYSIGN 8579683Slinton { 8589683Slinton $$ = amper($2); 8599683Slinton } 8609683Slinton | 8619683Slinton exp '+' exp 8629683Slinton { 8639683Slinton $$ = build(O_ADD, $1, $3); 8649683Slinton } 8659683Slinton | 8669683Slinton exp '-' exp 8679683Slinton { 8689683Slinton $$ = build(O_SUB, $1, $3); 8699683Slinton } 8709683Slinton | 8719683Slinton exp '*' exp 8729683Slinton { 8739683Slinton $$ = build(O_MUL, $1, $3); 8749683Slinton } 8759683Slinton | 8769683Slinton exp '/' exp 8779683Slinton { 8789683Slinton $$ = build(O_DIVF, $1, $3); 8799683Slinton } 8809683Slinton | 8819683Slinton exp DIV exp 8829683Slinton { 8839683Slinton $$ = build(O_DIV, $1, $3); 8849683Slinton } 8859683Slinton | 8869683Slinton exp MOD exp 8879683Slinton { 8889683Slinton $$ = build(O_MOD, $1, $3); 8899683Slinton } 8909683Slinton | 8919683Slinton exp AND exp 8929683Slinton { 8939683Slinton $$ = build(O_AND, $1, $3); 8949683Slinton } 8959683Slinton | 8969683Slinton exp OR exp 8979683Slinton { 8989683Slinton $$ = build(O_OR, $1, $3); 8999683Slinton } 9009683Slinton | 9019683Slinton exp '<' exp 9029683Slinton { 9039683Slinton $$ = build(O_LT, $1, $3); 9049683Slinton } 9059683Slinton | 9069683Slinton exp '<' '=' exp 9079683Slinton { 9089683Slinton $$ = build(O_LE, $1, $4); 9099683Slinton } 9109683Slinton | 9119683Slinton exp '>' exp 9129683Slinton { 9139683Slinton $$ = build(O_GT, $1, $3); 9149683Slinton } 9159683Slinton | 9169683Slinton exp '>' '=' exp 9179683Slinton { 9189683Slinton $$ = build(O_GE, $1, $4); 9199683Slinton } 9209683Slinton | 9219683Slinton exp '=' exp 9229683Slinton { 9239683Slinton $$ = build(O_EQ, $1, $3); 9249683Slinton } 9259683Slinton | 9269683Slinton exp '=' '=' exp 9279683Slinton { 9289683Slinton $$ = build(O_EQ, $1, $4); 9299683Slinton } 9309683Slinton | 9319683Slinton exp '<' '>' exp 9329683Slinton { 9339683Slinton $$ = build(O_NE, $1, $4); 9349683Slinton } 9359683Slinton | 9369683Slinton exp '!' '=' exp 9379683Slinton { 9389683Slinton $$ = build(O_NE, $1, $4); 9399683Slinton } 9409683Slinton | 9419683Slinton '(' exp ')' 9429683Slinton { 9439683Slinton $$ = $2; 9449683Slinton } 9459683Slinton ; 9469683Slinton term: 9479683Slinton symbol 9489683Slinton { 9499683Slinton $$ = $1; 9509683Slinton } 9519683Slinton | 9529683Slinton term '[' exp_list ']' 9539683Slinton { 9549683Slinton $$ = subscript($1, $3); 9559683Slinton } 9569683Slinton | 9579683Slinton term '.' name 9589683Slinton { 9599683Slinton $$ = dot($1, $3); 9609683Slinton } 9619683Slinton | 9629683Slinton term ARROW name 9639683Slinton { 9649683Slinton $$ = dot($1, $3); 9659683Slinton } 9669683Slinton | 9679683Slinton '*' term %prec UNARYSIGN 9689683Slinton { 9699683Slinton $$ = build(O_INDIR, $2); 9709683Slinton } 9719683Slinton | 9729683Slinton '*' '(' exp ')' %prec UNARYSIGN 9739683Slinton { 9749683Slinton $$ = build(O_INDIR, $3); 9759683Slinton } 9769683Slinton | 9779683Slinton term '^' %prec UNARYSIGN 9789683Slinton { 9799683Slinton $$ = build(O_INDIR, $1); 9809683Slinton } 9819683Slinton | 9829683Slinton '#' term %prec UNARYSIGN 9839683Slinton { 9849683Slinton $$ = concrete($2); 9859683Slinton } 9869683Slinton | 98716607Ssam '#' '(' exp ')' %prec UNARYSIGN 98816607Ssam { 98916607Ssam $$ = concrete($3); 99016607Ssam } 99116607Ssam | 99212482Slinton term '(' opt_exp_list ')' 9939683Slinton { 9949683Slinton $$ = build(O_CALL, $1, $3); 9959683Slinton } 9969683Slinton ; 9979683Slinton boolean_exp: 9989683Slinton exp 9999683Slinton { 10009683Slinton chkboolean($1); 10019683Slinton $$ = $1; 10029683Slinton } 10039683Slinton ; 10049683Slinton constant: 10059683Slinton INT 10069683Slinton { 10079683Slinton $$ = build(O_LCON, $1); 10089683Slinton } 10099683Slinton | 10109683Slinton REAL 10119683Slinton { 10129683Slinton $$ = build(O_FCON, $1); 10139683Slinton } 10149683Slinton | 10159683Slinton STRING 10169683Slinton { 10179683Slinton $$ = build(O_SCON, $1); 10189683Slinton } 10199683Slinton ; 102016607Ssam opt_qual_symbol: 102116607Ssam symbol 102216607Ssam { 102316607Ssam $$ = $1; 102416607Ssam } 102516607Ssam | 102616607Ssam opt_qual_symbol '.' name 102716607Ssam { 102816607Ssam $$ = dot($1, $3); 102916607Ssam } 103016607Ssam ; 10319683Slinton symbol: 10329683Slinton name 10339683Slinton { 10349683Slinton $$ = build(O_SYM, which($1)); 10359683Slinton } 103616607Ssam | 103716607Ssam '.' name 103816607Ssam { 103916607Ssam $$ = dot(build(O_SYM, program), $2); 104016607Ssam } 10419683Slinton ; 10429683Slinton name: 10439683Slinton NAME 10449683Slinton { 10459683Slinton $$ = $1; 10469683Slinton } 10479683Slinton | 10489683Slinton keyword 10499683Slinton { 10509683Slinton $$ = $1; 10519683Slinton } 10529683Slinton keyword: 105312536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 105416607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 105516607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 105616607Ssam RERUN | RETURN | RUN | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 105716607Ssam STOP | STOPI | TRACE | TRACEI | UP | 105813840Slinton USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH 10599683Slinton ; 1060*16926Ssam 1061*16926Ssam something: 1062*16926Ssam NAME 1063*16926Ssam { 1064*16926Ssam $$ = build(O_NAME, $1); 1065*16926Ssam } 1066*16926Ssam | 1067*16926Ssam keyword 1068*16926Ssam { 1069*16926Ssam $$ = build(O_NAME, $1); 1070*16926Ssam } 1071*16926Ssam | 1072*16926Ssam STRING 1073*16926Ssam { 1074*16926Ssam $$ = build(O_SCON, $1); 1075*16926Ssam } 1076*16926Ssam ; 1077