19683Slinton %{ 29683Slinton 39683Slinton /* Copyright (c) 1982 Regents of the University of California */ 49683Slinton 5*16625Ssam static char sccsid[] = "@(#)commands.y 1.11 (Berkeley) 06/23/84"; 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" 1914673Slinton #include "lists.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 7416607Ssam %type <y_node> integer_list alias_command list_command line_number 75*16625Ssam %type <y_node> search_command pattern 769683Slinton %type <y_cmdlist> actions 7714673Slinton %type <y_list> sourcepath 789683Slinton 799683Slinton %% 809683Slinton 819683Slinton input: 829683Slinton input command_nl 839683Slinton | 849683Slinton /* empty */ 859683Slinton ; 869683Slinton command_nl: 879683Slinton command_line '\n' 889683Slinton | 899683Slinton command_line ';' 909683Slinton | 919683Slinton '\n' 929683Slinton ; 939683Slinton 949683Slinton command_line: 959683Slinton command 969683Slinton { 979683Slinton if ($1 != nil) { 9812536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 999683Slinton eval($1); 1009683Slinton } 1019683Slinton } 1029683Slinton | 1039683Slinton rcommand redirectout 1049683Slinton { 1059683Slinton if ($1 != nil) { 1069683Slinton if ($2 != nil) { 1079683Slinton setout($2); 10812536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1099683Slinton eval($1); 1109683Slinton unsetout(); 1119683Slinton } else { 11212536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1139683Slinton eval($1); 1149683Slinton } 1159683Slinton } 1169683Slinton } 1179683Slinton ; 1189683Slinton redirectout: 1199683Slinton '>' shellmode NAME 1209683Slinton { 1219683Slinton $$ = ident($3); 1229683Slinton } 1239683Slinton | 1249683Slinton /* empty */ 1259683Slinton { 1269683Slinton $$ = nil; 1279683Slinton } 1289683Slinton ; 1299683Slinton 1309683Slinton /* 1319683Slinton * Non-redirectable commands. 1329683Slinton */ 1339683Slinton command: 1349683Slinton alias_command 1359683Slinton { 1369683Slinton $$ = $1; 1379683Slinton } 1389683Slinton | 1399683Slinton ASSIGN term '=' exp 1409683Slinton { 1419683Slinton $$ = build(O_ASSIGN, $2, $4); 1429683Slinton } 1439683Slinton | 1449683Slinton CATCH INT 1459683Slinton { 1469683Slinton $$ = build(O_CATCH, $2); 1479683Slinton } 1489683Slinton | 1499683Slinton CONT 1509683Slinton { 15114673Slinton $$ = build(O_CONT, (long) DEFSIG); 1529683Slinton } 1539683Slinton | 15411870Slinton CONT INT 15511870Slinton { 15611870Slinton $$ = build(O_CONT, $2); 15711870Slinton } 15811870Slinton | 15916607Ssam DELETE integer_list 1609683Slinton { 1619683Slinton $$ = build(O_DELETE, $2); 1629683Slinton } 1639683Slinton | 16416607Ssam DOWN 16516607Ssam { 16616607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 16716607Ssam } 16816607Ssam | 16916607Ssam DOWN INT 17016607Ssam { 17116607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 17216607Ssam } 17316607Ssam | 1749683Slinton EDIT shellmode opt_filename 1759683Slinton { 1769683Slinton $$ = build(O_EDIT, $3); 1779683Slinton } 1789683Slinton | 1799683Slinton FILE shellmode opt_filename 1809683Slinton { 1819683Slinton $$ = build(O_CHFILE, $3); 1829683Slinton } 1839683Slinton | 1849683Slinton FUNC 1859683Slinton { 1869683Slinton $$ = build(O_FUNC, nil); 1879683Slinton } 1889683Slinton | 18916607Ssam FUNC opt_qual_symbol 1909683Slinton { 1919683Slinton $$ = build(O_FUNC, $2); 1929683Slinton } 1939683Slinton | 1949683Slinton GRIPE 1959683Slinton { 1969683Slinton $$ = build(O_GRIPE); 1979683Slinton } 1989683Slinton | 1999683Slinton HELP 2009683Slinton { 2019683Slinton $$ = build(O_HELP); 2029683Slinton } 2039683Slinton | 2049683Slinton IGNORE INT 2059683Slinton { 2069683Slinton $$ = build(O_IGNORE, $2); 2079683Slinton } 2089683Slinton | 2099683Slinton list_command 2109683Slinton { 2119683Slinton $$ = $1; 2129683Slinton } 2139683Slinton | 2149683Slinton PSYM term 2159683Slinton { 2169683Slinton $$ = build(O_PSYM, $2); 2179683Slinton } 2189683Slinton | 2199683Slinton QUIT 2209683Slinton { 2219683Slinton if (not popinput()) { 2229683Slinton quit(0); 2239683Slinton } else { 2249683Slinton $$ = nil; 2259683Slinton } 2269683Slinton } 2279683Slinton | 22816607Ssam RETURN 22916607Ssam { 23016607Ssam $$ = build(O_RETURN, nil); 23116607Ssam } 23216607Ssam | 23316607Ssam RETURN opt_qual_symbol 23416607Ssam { 23516607Ssam $$ = build(O_RETURN, $2); 23616607Ssam } 23716607Ssam | 2389683Slinton runcommand 2399683Slinton { 2409683Slinton run(); 2419683Slinton /* NOTREACHED */ 2429683Slinton } 2439683Slinton | 2449683Slinton SH 2459683Slinton { 2469683Slinton shellline(); 2479683Slinton $$ = nil; 2489683Slinton } 2499683Slinton | 2509683Slinton SOURCE shellmode filename 2519683Slinton { 2529683Slinton $$ = build(O_SOURCE, $3); 2539683Slinton } 2549683Slinton | 2559683Slinton step 2569683Slinton { 2579683Slinton $$ = $1; 2589683Slinton } 2599683Slinton | 2609683Slinton stop where opt_cond 2619683Slinton { 2629683Slinton $$ = build($1, nil, $2, $3); 2639683Slinton } 2649683Slinton | 2659683Slinton stop what opt_cond 2669683Slinton { 2679683Slinton $$ = build($1, $2, nil, $3); 2689683Slinton } 2699683Slinton | 2709683Slinton stop IF boolean_exp 2719683Slinton { 2729683Slinton $$ = build($1, nil, nil, $3); 2739683Slinton } 2749683Slinton | 2759683Slinton trace what where opt_cond 2769683Slinton { 2779683Slinton $$ = build($1, $2, $3, $4); 2789683Slinton } 2799683Slinton | 2809683Slinton trace where opt_cond 2819683Slinton { 2829683Slinton $$ = build($1, nil, $2, $3); 2839683Slinton } 2849683Slinton | 2859683Slinton trace what opt_cond 2869683Slinton { 2879683Slinton $$ = build($1, $2, nil, $3); 2889683Slinton } 2899683Slinton | 2909683Slinton trace opt_cond 2919683Slinton { 2929683Slinton $$ = build($1, nil, nil, $2); 2939683Slinton } 2949683Slinton | 29516607Ssam UP 2969683Slinton { 29716607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 2989683Slinton } 2999683Slinton | 30016607Ssam UP INT 3019683Slinton { 30216607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3039683Slinton } 3049683Slinton | 3059683Slinton USE shellmode sourcepath 3069683Slinton { 30714673Slinton String dir; 30814673Slinton 3099683Slinton $$ = nil; 31014673Slinton if (list_size($3) == 0) { 31114673Slinton foreach (String, dir, sourcepath) 31214673Slinton printf("%s ", dir); 31314673Slinton endfor 31414673Slinton printf("\n"); 31514673Slinton } else { 31614673Slinton foreach (String, dir, sourcepath) 31714673Slinton list_delete(list_curitem(sourcepath), sourcepath); 31814673Slinton endfor 31914673Slinton sourcepath = $3; 3209683Slinton } 3219683Slinton } 32216604Ssam | 32316607Ssam WHATIS term 32416604Ssam { 32516607Ssam $$ = build(O_WHATIS, $2); 32616604Ssam } 32716607Ssam | 32816607Ssam WHEN event '{' actions '}' 32916604Ssam { 33016607Ssam $$ = build(O_ADDEVENT, $2, $4); 33116604Ssam } 33216604Ssam | 33316607Ssam WHEREIS symbol 33416604Ssam { 33516607Ssam $$ = build(O_WHEREIS, $2); 33616604Ssam } 33716607Ssam | 33816607Ssam WHICH symbol 33916604Ssam { 34016607Ssam $$ = build(O_WHICH, $2); 34116604Ssam } 342*16625Ssam | 343*16625Ssam search_command 344*16625Ssam { 345*16625Ssam $$ = $1; 346*16625Ssam } 34716604Ssam ; 348*16625Ssam 349*16625Ssam 350*16625Ssam search_command: 351*16625Ssam '/' pattern 352*16625Ssam { 353*16625Ssam $$ = build(O_SEARCH, build(O_LCON, 1), $2); 354*16625Ssam } 355*16625Ssam | 356*16625Ssam '?' pattern 357*16625Ssam { 358*16625Ssam $$ = build(O_SEARCH, build(O_LCON, 0), $2); 359*16625Ssam } 360*16625Ssam ; 361*16625Ssam 362*16625Ssam pattern: 363*16625Ssam STRING 364*16625Ssam { 365*16625Ssam $$ = build(O_SCON, $1); 366*16625Ssam } 367*16625Ssam ; 368*16625Ssam 3699683Slinton runcommand: 37016607Ssam run arglist 37112482Slinton | 37212524Slinton run 3739683Slinton ; 3749683Slinton run: 37512524Slinton RUN shellmode 3769683Slinton { 37716607Ssam arginit(); 3789683Slinton fflush(stdout); 3799683Slinton } 38016607Ssam | 38116607Ssam RERUN shellmode 38216607Ssam { 38316607Ssam fflush(stdout); 38416607Ssam } 3859683Slinton ; 3869683Slinton arglist: 3879683Slinton arglist arg 3889683Slinton | 38912482Slinton arg 3909683Slinton ; 3919683Slinton arg: 3929683Slinton NAME 3939683Slinton { 3949683Slinton newarg(ident($1)); 3959683Slinton } 3969683Slinton | 39716607Ssam STRING 39816607Ssam { 39916607Ssam newarg($1); 40016607Ssam } 40116607Ssam | 4029683Slinton '<' NAME 4039683Slinton { 4049683Slinton inarg(ident($2)); 4059683Slinton } 4069683Slinton | 4079683Slinton '>' NAME 4089683Slinton { 4099683Slinton outarg(ident($2)); 4109683Slinton } 4119683Slinton ; 4129683Slinton step: 4139683Slinton STEP 4149683Slinton { 4159683Slinton $$ = build(O_STEP, true, false); 4169683Slinton } 4179683Slinton | 4189683Slinton STEPI 4199683Slinton { 4209683Slinton $$ = build(O_STEP, false, false); 4219683Slinton } 4229683Slinton | 4239683Slinton NEXT 4249683Slinton { 4259683Slinton $$ = build(O_STEP, true, true); 4269683Slinton } 4279683Slinton | 4289683Slinton NEXTI 4299683Slinton { 4309683Slinton $$ = build(O_STEP, false, true); 4319683Slinton } 4329683Slinton ; 4339683Slinton shellmode: 4349683Slinton /* empty */ 4359683Slinton { 4369683Slinton beginshellmode(); 4379683Slinton } 4389683Slinton ; 4399683Slinton sourcepath: 4409683Slinton sourcepath NAME 4419683Slinton { 44214673Slinton $$ = $1; 44314673Slinton list_append(list_item(ident($2)), nil, $$); 4449683Slinton } 4459683Slinton | 4469683Slinton /* empty */ 4479683Slinton { 44814673Slinton $$ = list_alloc(); 4499683Slinton } 4509683Slinton ; 4519683Slinton event: 4529683Slinton where 4539683Slinton | 4549683Slinton exp 4559683Slinton ; 4569683Slinton actions: 4579683Slinton actions cmd ';' 4589683Slinton { 4599683Slinton $$ = $1; 4609683Slinton cmdlist_append($2, $$); 4619683Slinton } 4629683Slinton | 4639683Slinton cmd ';' 4649683Slinton { 4659683Slinton $$ = list_alloc(); 4669683Slinton cmdlist_append($1, $$); 4679683Slinton } 4689683Slinton ; 4699683Slinton cmd: 4709683Slinton command 4719683Slinton | 4729683Slinton rcommand 4739683Slinton ; 4749683Slinton 4759683Slinton /* 4769683Slinton * Redirectable commands. 4779683Slinton */ 4789683Slinton rcommand: 4799683Slinton PRINT exp_list 4809683Slinton { 4819683Slinton $$ = build(O_PRINT, $2); 4829683Slinton } 4839683Slinton | 4849683Slinton WHERE 4859683Slinton { 4869683Slinton $$ = build(O_WHERE); 4879683Slinton } 4889683Slinton | 4899683Slinton examine 4909683Slinton { 4919683Slinton $$ = $1; 4929683Slinton } 4939683Slinton | 49416607Ssam CALL term '(' opt_exp_list ')' 4959683Slinton { 49616607Ssam $$ = build(O_CALL, $2, $4); 4979683Slinton } 4989683Slinton | 49912536Scsvaf DEBUG INT 50012536Scsvaf { 50112536Scsvaf $$ = build(O_DEBUG, $2); 50212536Scsvaf } 50312536Scsvaf | 5049683Slinton DUMP 5059683Slinton { 5069683Slinton $$ = build(O_DUMP); 5079683Slinton } 5089683Slinton | 5099683Slinton STATUS 5109683Slinton { 5119683Slinton $$ = build(O_STATUS); 5129683Slinton } 5139683Slinton ; 5149683Slinton alias_command: 5159683Slinton ALIAS name name 5169683Slinton { 5179683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 5189683Slinton } 5199683Slinton | 5209683Slinton ALIAS name 5219683Slinton { 5229683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 5239683Slinton } 5249683Slinton | 5259683Slinton ALIAS 5269683Slinton { 5279683Slinton $$ = build(O_ALIAS, nil, nil); 5289683Slinton } 5299683Slinton ; 5309683Slinton trace: 5319683Slinton TRACE 5329683Slinton { 5339683Slinton $$ = O_TRACE; 5349683Slinton } 5359683Slinton | 5369683Slinton TRACEI 5379683Slinton { 5389683Slinton $$ = O_TRACEI; 5399683Slinton } 5409683Slinton ; 5419683Slinton stop: 5429683Slinton STOP 5439683Slinton { 5449683Slinton $$ = O_STOP; 5459683Slinton } 5469683Slinton | 5479683Slinton STOPI 5489683Slinton { 5499683Slinton $$ = O_STOPI; 5509683Slinton } 5519683Slinton ; 5529683Slinton what: 5539683Slinton exp 5549683Slinton { 5559683Slinton $$ = $1; 5569683Slinton } 5579683Slinton | 5589683Slinton STRING ':' line_number 5599683Slinton { 5609683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 5619683Slinton } 5629683Slinton ; 5639683Slinton where: 5649683Slinton IN term 5659683Slinton { 5669683Slinton $$ = $2; 5679683Slinton } 5689683Slinton | 5699683Slinton AT line_number 5709683Slinton { 5719683Slinton $$ = build(O_QLINE, build(O_SCON, cursource), $2); 5729683Slinton } 5739683Slinton | 5749683Slinton AT STRING ':' line_number 5759683Slinton { 5769683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 5779683Slinton } 5789683Slinton ; 5799683Slinton filename: 5809683Slinton NAME 5819683Slinton { 5829683Slinton $$ = ident($1); 5839683Slinton } 5849683Slinton ; 5859683Slinton opt_filename: 5869683Slinton /* empty */ 5879683Slinton { 5889683Slinton $$ = nil; 5899683Slinton } 5909683Slinton | 5919683Slinton filename 5929683Slinton { 5939683Slinton $$ = $1; 5949683Slinton } 5959683Slinton ; 59612482Slinton opt_exp_list: 59712482Slinton exp_list 5989683Slinton { 59912482Slinton $$ = $1; 6009683Slinton } 6019683Slinton | 60212482Slinton /* empty */ 6039683Slinton { 60412482Slinton $$ = nil; 6059683Slinton } 6069683Slinton ; 6079683Slinton list_command: 6089683Slinton LIST 6099683Slinton { 6109683Slinton $$ = build(O_LIST, 6119683Slinton build(O_LCON, (long) cursrcline), 6129683Slinton build(O_LCON, (long) cursrcline + 9) 6139683Slinton ); 6149683Slinton } 6159683Slinton | 6169683Slinton LIST line_number 6179683Slinton { 6189683Slinton $$ = build(O_LIST, $2, $2); 6199683Slinton } 6209683Slinton | 6219683Slinton LIST line_number ',' line_number 6229683Slinton { 6239683Slinton $$ = build(O_LIST, $2, $4); 6249683Slinton } 6259683Slinton | 62616607Ssam LIST opt_qual_symbol 6279683Slinton { 6289683Slinton $$ = build(O_LIST, $2); 6299683Slinton } 6309683Slinton ; 63116607Ssam integer_list: 63216607Ssam INT 63316607Ssam { 63416607Ssam $$ = build(O_LCON, $1); 63516607Ssam } 63616607Ssam | 63716607Ssam INT integer_list 63816607Ssam { 63916607Ssam $$ = build(O_COMMA, build(O_LCON, $1), $2); 64016607Ssam } 64116607Ssam ; 6429683Slinton line_number: 6439683Slinton INT 6449683Slinton { 6459683Slinton $$ = build(O_LCON, $1); 6469683Slinton } 6479683Slinton | 6489683Slinton '$' 6499683Slinton { 6509683Slinton $$ = build(O_LCON, (long) LASTLINE); 6519683Slinton } 6529683Slinton ; 6539683Slinton examine: 6549683Slinton address '/' count mode 6559683Slinton { 6569683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 6579683Slinton } 6589683Slinton | 6599683Slinton address ',' address '/' mode 6609683Slinton { 6619683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 6629683Slinton } 6639683Slinton | 6649683Slinton '/' count mode 6659683Slinton { 6669683Slinton $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2); 6679683Slinton } 66811173Slinton | 66911173Slinton address '=' mode 67011173Slinton { 67111173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 67211173Slinton } 6739683Slinton ; 6749683Slinton address: 6759683Slinton INT 6769683Slinton { 6779683Slinton $$ = build(O_LCON, $1); 6789683Slinton } 6799683Slinton | 6809683Slinton '&' term 6819683Slinton { 6829683Slinton $$ = amper($2); 6839683Slinton } 6849683Slinton | 6859683Slinton address '+' address 6869683Slinton { 6879683Slinton $$ = build(O_ADD, $1, $3); 6889683Slinton } 6899683Slinton | 6909683Slinton address '-' address 6919683Slinton { 6929683Slinton $$ = build(O_SUB, $1, $3); 6939683Slinton } 6949683Slinton | 6959683Slinton address '*' address 6969683Slinton { 6979683Slinton $$ = build(O_MUL, $1, $3); 6989683Slinton } 6999683Slinton | 7009683Slinton '*' address %prec UNARYSIGN 7019683Slinton { 7029683Slinton $$ = build(O_INDIR, $2); 7039683Slinton } 7049683Slinton | 7059683Slinton '(' exp ')' 7069683Slinton { 7079683Slinton $$ = $2; 7089683Slinton } 7099683Slinton ; 7109683Slinton count: 7119683Slinton /* empty */ 7129683Slinton { 7139683Slinton $$ = 1; 7149683Slinton } 7159683Slinton | 7169683Slinton INT 7179683Slinton { 7189683Slinton $$ = $1; 7199683Slinton } 7209683Slinton ; 7219683Slinton mode: 7229683Slinton name 7239683Slinton { 7249683Slinton $$ = ident($1); 7259683Slinton curformat = $$; 7269683Slinton } 7279683Slinton | 7289683Slinton /* empty */ 7299683Slinton { 7309683Slinton $$ = curformat; 7319683Slinton } 7329683Slinton ; 7339683Slinton opt_cond: 7349683Slinton /* empty */ 7359683Slinton { 7369683Slinton $$ = nil; 7379683Slinton } 7389683Slinton | 7399683Slinton IF boolean_exp 7409683Slinton { 7419683Slinton $$ = $2; 7429683Slinton } 7439683Slinton ; 7449683Slinton exp_list: 7459683Slinton exp 7469683Slinton { 7479683Slinton $$ = build(O_COMMA, $1, nil); 7489683Slinton } 7499683Slinton | 7509683Slinton exp ',' exp_list 7519683Slinton { 7529683Slinton $$ = build(O_COMMA, $1, $3); 7539683Slinton } 7549683Slinton ; 7559683Slinton exp: 7569683Slinton term 7579683Slinton { 7589683Slinton $$ = build(O_RVAL, $1); 7599683Slinton } 7609683Slinton | 7619683Slinton constant 7629683Slinton { 7639683Slinton $$ = $1; 7649683Slinton } 7659683Slinton | 76616607Ssam exp '\\' opt_qual_symbol 76711173Slinton { 76811173Slinton $$ = build(O_TYPERENAME, $1, $3); 76911173Slinton } 77011173Slinton | 7719683Slinton '+' exp %prec UNARYSIGN 7729683Slinton { 7739683Slinton $$ = $2; 7749683Slinton } 7759683Slinton | 7769683Slinton '-' exp %prec UNARYSIGN 7779683Slinton { 7789683Slinton $$ = build(O_NEG, $2); 7799683Slinton } 7809683Slinton | 7819683Slinton '&' exp %prec UNARYSIGN 7829683Slinton { 7839683Slinton $$ = amper($2); 7849683Slinton } 7859683Slinton | 7869683Slinton exp '+' exp 7879683Slinton { 7889683Slinton $$ = build(O_ADD, $1, $3); 7899683Slinton } 7909683Slinton | 7919683Slinton exp '-' exp 7929683Slinton { 7939683Slinton $$ = build(O_SUB, $1, $3); 7949683Slinton } 7959683Slinton | 7969683Slinton exp '*' exp 7979683Slinton { 7989683Slinton $$ = build(O_MUL, $1, $3); 7999683Slinton } 8009683Slinton | 8019683Slinton exp '/' exp 8029683Slinton { 8039683Slinton $$ = build(O_DIVF, $1, $3); 8049683Slinton } 8059683Slinton | 8069683Slinton exp DIV exp 8079683Slinton { 8089683Slinton $$ = build(O_DIV, $1, $3); 8099683Slinton } 8109683Slinton | 8119683Slinton exp MOD exp 8129683Slinton { 8139683Slinton $$ = build(O_MOD, $1, $3); 8149683Slinton } 8159683Slinton | 8169683Slinton exp AND exp 8179683Slinton { 8189683Slinton $$ = build(O_AND, $1, $3); 8199683Slinton } 8209683Slinton | 8219683Slinton exp OR exp 8229683Slinton { 8239683Slinton $$ = build(O_OR, $1, $3); 8249683Slinton } 8259683Slinton | 8269683Slinton exp '<' exp 8279683Slinton { 8289683Slinton $$ = build(O_LT, $1, $3); 8299683Slinton } 8309683Slinton | 8319683Slinton exp '<' '=' exp 8329683Slinton { 8339683Slinton $$ = build(O_LE, $1, $4); 8349683Slinton } 8359683Slinton | 8369683Slinton exp '>' exp 8379683Slinton { 8389683Slinton $$ = build(O_GT, $1, $3); 8399683Slinton } 8409683Slinton | 8419683Slinton exp '>' '=' exp 8429683Slinton { 8439683Slinton $$ = build(O_GE, $1, $4); 8449683Slinton } 8459683Slinton | 8469683Slinton exp '=' exp 8479683Slinton { 8489683Slinton $$ = build(O_EQ, $1, $3); 8499683Slinton } 8509683Slinton | 8519683Slinton exp '=' '=' exp 8529683Slinton { 8539683Slinton $$ = build(O_EQ, $1, $4); 8549683Slinton } 8559683Slinton | 8569683Slinton exp '<' '>' exp 8579683Slinton { 8589683Slinton $$ = build(O_NE, $1, $4); 8599683Slinton } 8609683Slinton | 8619683Slinton exp '!' '=' exp 8629683Slinton { 8639683Slinton $$ = build(O_NE, $1, $4); 8649683Slinton } 8659683Slinton | 8669683Slinton '(' exp ')' 8679683Slinton { 8689683Slinton $$ = $2; 8699683Slinton } 8709683Slinton ; 8719683Slinton term: 8729683Slinton symbol 8739683Slinton { 8749683Slinton $$ = $1; 8759683Slinton } 8769683Slinton | 8779683Slinton term '[' exp_list ']' 8789683Slinton { 8799683Slinton $$ = subscript($1, $3); 8809683Slinton } 8819683Slinton | 8829683Slinton term '.' name 8839683Slinton { 8849683Slinton $$ = dot($1, $3); 8859683Slinton } 8869683Slinton | 8879683Slinton term ARROW name 8889683Slinton { 8899683Slinton $$ = dot($1, $3); 8909683Slinton } 8919683Slinton | 8929683Slinton '*' term %prec UNARYSIGN 8939683Slinton { 8949683Slinton $$ = build(O_INDIR, $2); 8959683Slinton } 8969683Slinton | 8979683Slinton '*' '(' exp ')' %prec UNARYSIGN 8989683Slinton { 8999683Slinton $$ = build(O_INDIR, $3); 9009683Slinton } 9019683Slinton | 9029683Slinton term '^' %prec UNARYSIGN 9039683Slinton { 9049683Slinton $$ = build(O_INDIR, $1); 9059683Slinton } 9069683Slinton | 9079683Slinton '#' term %prec UNARYSIGN 9089683Slinton { 9099683Slinton $$ = concrete($2); 9109683Slinton } 9119683Slinton | 91216607Ssam '#' '(' exp ')' %prec UNARYSIGN 91316607Ssam { 91416607Ssam $$ = concrete($3); 91516607Ssam } 91616607Ssam | 91712482Slinton term '(' opt_exp_list ')' 9189683Slinton { 9199683Slinton $$ = build(O_CALL, $1, $3); 9209683Slinton } 9219683Slinton ; 9229683Slinton boolean_exp: 9239683Slinton exp 9249683Slinton { 9259683Slinton chkboolean($1); 9269683Slinton $$ = $1; 9279683Slinton } 9289683Slinton ; 9299683Slinton constant: 9309683Slinton INT 9319683Slinton { 9329683Slinton $$ = build(O_LCON, $1); 9339683Slinton } 9349683Slinton | 9359683Slinton REAL 9369683Slinton { 9379683Slinton $$ = build(O_FCON, $1); 9389683Slinton } 9399683Slinton | 9409683Slinton STRING 9419683Slinton { 9429683Slinton $$ = build(O_SCON, $1); 9439683Slinton } 9449683Slinton ; 94516607Ssam opt_qual_symbol: 94616607Ssam symbol 94716607Ssam { 94816607Ssam $$ = $1; 94916607Ssam } 95016607Ssam | 95116607Ssam opt_qual_symbol '.' name 95216607Ssam { 95316607Ssam $$ = dot($1, $3); 95416607Ssam } 95516607Ssam ; 9569683Slinton symbol: 9579683Slinton name 9589683Slinton { 9599683Slinton $$ = build(O_SYM, which($1)); 9609683Slinton } 96116607Ssam | 96216607Ssam '.' name 96316607Ssam { 96416607Ssam $$ = dot(build(O_SYM, program), $2); 96516607Ssam } 9669683Slinton ; 9679683Slinton name: 9689683Slinton NAME 9699683Slinton { 9709683Slinton $$ = $1; 9719683Slinton } 9729683Slinton | 9739683Slinton keyword 9749683Slinton { 9759683Slinton $$ = $1; 9769683Slinton } 9779683Slinton keyword: 97812536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 97916607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 98016607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 98116607Ssam RERUN | RETURN | RUN | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 98216607Ssam STOP | STOPI | TRACE | TRACEI | UP | 98313840Slinton USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH 9849683Slinton ; 985