121633Sdist %{ 221633Sdist 321631Sdist /* 438105Sbostic * Copyright (c) 1983 The Regents of the University of California. 538105Sbostic * All rights reserved. 621631Sdist * 7*42683Sbostic * %sccs.include.redist.c% 821631Sdist */ 921631Sdist 1038105Sbostic #ifndef lint 11*42683Sbostic static char sccsid[] = "@(#)commands.y 5.6 (Berkeley) 06/01/90"; 1238105Sbostic #endif /* not lint */ 1318214Slinton 149683Slinton /* 159683Slinton * Yacc grammar for debugger commands. 169683Slinton */ 179683Slinton 189683Slinton #include "defs.h" 199683Slinton #include "symbols.h" 209683Slinton #include "operators.h" 219683Slinton #include "tree.h" 229683Slinton #include "process.h" 239683Slinton #include "source.h" 249683Slinton #include "scanner.h" 2518214Slinton #include "keywords.h" 269683Slinton #include "names.h" 2714673Slinton #include "lists.h" 289683Slinton 299683Slinton private String curformat = "X"; 309683Slinton 319683Slinton %} 329683Slinton 339683Slinton %term 3416607Ssam ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP 359683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 3618214Slinton PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS STEP STEPI 3718214Slinton STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE 3818214Slinton WHATIS WHEN WHERE WHEREIS WHICH 399683Slinton 4018214Slinton %term INT CHAR REAL NAME STRING 4118214Slinton %term ARROW 429683Slinton 439683Slinton %right INT 449683Slinton %binary REDIRECT 459683Slinton %binary '<' '=' '>' '!' IN 469683Slinton %left '+' '-' OR 479683Slinton %left UNARYSIGN 489683Slinton %left '*' '/' DIV MOD AND 4918214Slinton %left '\\' 509683Slinton %left NOT '(' '[' '.' '^' ARROW 519683Slinton 529683Slinton %union { 539683Slinton Name y_name; 549683Slinton Symbol y_sym; 559683Slinton Node y_node; 569683Slinton Integer y_int; 579683Slinton Operator y_op; 589683Slinton long y_long; 5918214Slinton char y_char; 609683Slinton double y_real; 619683Slinton String y_string; 629683Slinton Boolean y_bool; 639683Slinton Cmdlist y_cmdlist; 6414673Slinton List y_list; 659683Slinton }; 669683Slinton 679683Slinton %type <y_op> trace stop 6818214Slinton %type <y_long> INT count signal 6918214Slinton %type <y_char> CHAR 709683Slinton %type <y_real> REAL 719683Slinton %type <y_string> STRING redirectout filename opt_filename mode 7216607Ssam %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT 7316607Ssam %type <y_name> DEBUG DELETE DIV DOWN DUMP 749683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 759683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 7618214Slinton %type <y_name> PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS 7716607Ssam %type <y_name> STEP STEPI STOP STOPI TRACE TRACEI 7818214Slinton %type <y_name> UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH 799683Slinton %type <y_name> name NAME keyword 8016607Ssam %type <y_node> opt_qual_symbol symbol 819683Slinton %type <y_node> command rcommand cmd step what where examine 8212482Slinton %type <y_node> event opt_exp_list opt_cond 839683Slinton %type <y_node> exp_list exp term boolean_exp constant address 8416934Ssam %type <y_node> integer_list alias_command list_command line_number 859683Slinton %type <y_cmdlist> actions 8618214Slinton %type <y_list> sourcepath name_list 879683Slinton 889683Slinton %% 899683Slinton 909683Slinton input: 919683Slinton input command_nl 929683Slinton | 939683Slinton /* empty */ 949683Slinton ; 959683Slinton command_nl: 969683Slinton command_line '\n' 9718214Slinton | 9818214Slinton command_line ';' 9916926Ssam { 10018214Slinton chkalias = true; 10116926Ssam } 1029683Slinton | 1039683Slinton '\n' 1049683Slinton ; 1059683Slinton 1069683Slinton command_line: 1079683Slinton command 1089683Slinton { 1099683Slinton if ($1 != nil) { 11018214Slinton topeval($1); 1119683Slinton } 1129683Slinton } 1139683Slinton | 1149683Slinton rcommand redirectout 1159683Slinton { 1169683Slinton if ($1 != nil) { 1179683Slinton if ($2 != nil) { 1189683Slinton setout($2); 11918214Slinton topeval($1); 1209683Slinton unsetout(); 1219683Slinton } else { 12218214Slinton topeval($1); 1239683Slinton } 1249683Slinton } 1259683Slinton } 1269683Slinton ; 1279683Slinton redirectout: 1289683Slinton '>' shellmode NAME 1299683Slinton { 1309683Slinton $$ = ident($3); 1319683Slinton } 1329683Slinton | 1339683Slinton /* empty */ 1349683Slinton { 1359683Slinton $$ = nil; 1369683Slinton } 1379683Slinton ; 1389683Slinton 1399683Slinton /* 1409683Slinton * Non-redirectable commands. 1419683Slinton */ 1429683Slinton command: 1439683Slinton alias_command 1449683Slinton { 1459683Slinton $$ = $1; 1469683Slinton } 1479683Slinton | 14818214Slinton ASSIGN exp '=' exp 1499683Slinton { 15018214Slinton $$ = build(O_ASSIGN, unrval($2), $4); 1519683Slinton } 1529683Slinton | 15318214Slinton CATCH signal 1549683Slinton { 15518214Slinton $$ = build(O_CATCH, $2); 1569683Slinton } 1579683Slinton | 15818214Slinton CATCH 15916926Ssam { 16018214Slinton $$ = build(O_CATCH, 0); 16116926Ssam } 16216926Ssam | 1639683Slinton CONT 1649683Slinton { 16514673Slinton $$ = build(O_CONT, (long) DEFSIG); 1669683Slinton } 1679683Slinton | 16818214Slinton CONT signal 16911870Slinton { 17011870Slinton $$ = build(O_CONT, $2); 17111870Slinton } 17211870Slinton | 17316934Ssam DELETE integer_list 1749683Slinton { 1759683Slinton $$ = build(O_DELETE, $2); 1769683Slinton } 1779683Slinton | 17816607Ssam DOWN 17916607Ssam { 18016607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 18116607Ssam } 18216607Ssam | 18316607Ssam DOWN INT 18416607Ssam { 18516607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 18616607Ssam } 18716607Ssam | 1889683Slinton EDIT shellmode opt_filename 1899683Slinton { 1909683Slinton $$ = build(O_EDIT, $3); 1919683Slinton } 1929683Slinton | 1939683Slinton FILE shellmode opt_filename 1949683Slinton { 1959683Slinton $$ = build(O_CHFILE, $3); 1969683Slinton } 1979683Slinton | 1989683Slinton FUNC 1999683Slinton { 2009683Slinton $$ = build(O_FUNC, nil); 2019683Slinton } 2029683Slinton | 20318214Slinton FUNC opt_qual_symbol 2049683Slinton { 20518214Slinton $$ = build(O_FUNC, $2); 2069683Slinton } 2079683Slinton | 2089683Slinton GRIPE 2099683Slinton { 2109683Slinton $$ = build(O_GRIPE); 2119683Slinton } 2129683Slinton | 2139683Slinton HELP 2149683Slinton { 2159683Slinton $$ = build(O_HELP); 2169683Slinton } 2179683Slinton | 21818214Slinton IGNORE signal 2199683Slinton { 22018214Slinton $$ = build(O_IGNORE, $2); 2219683Slinton } 2229683Slinton | 22318214Slinton IGNORE 22416926Ssam { 22518214Slinton $$ = build(O_IGNORE, 0); 22616926Ssam } 22716926Ssam | 2289683Slinton list_command 2299683Slinton { 2309683Slinton $$ = $1; 2319683Slinton } 2329683Slinton | 23318214Slinton PSYM exp 2349683Slinton { 23518214Slinton $$ = build(O_PSYM, unrval($2)); 2369683Slinton } 2379683Slinton | 2389683Slinton QUIT 2399683Slinton { 2409683Slinton if (not popinput()) { 2419683Slinton quit(0); 2429683Slinton } else { 2439683Slinton $$ = nil; 2449683Slinton } 2459683Slinton } 2469683Slinton | 24716607Ssam RETURN 24816607Ssam { 24916607Ssam $$ = build(O_RETURN, nil); 25016607Ssam } 25116607Ssam | 25218214Slinton RETURN opt_qual_symbol 25316607Ssam { 25418214Slinton $$ = build(O_RETURN, $2); 25516607Ssam } 25616607Ssam | 2579683Slinton runcommand 2589683Slinton { 2599683Slinton run(); 2609683Slinton /* NOTREACHED */ 2619683Slinton } 2629683Slinton | 26318214Slinton SET name '=' exp 26418214Slinton { 26518214Slinton $$ = build(O_SET, build(O_NAME, $2), $4); 26618214Slinton } 26718214Slinton | 26818214Slinton SET name 26918214Slinton { 27018214Slinton $$ = build(O_SET, build(O_NAME, $2), nil); 27118214Slinton } 27218214Slinton | 27318214Slinton SET 27418214Slinton { 27518214Slinton $$ = build(O_SET, nil, nil); 27618214Slinton } 27718214Slinton | 2789683Slinton SH 2799683Slinton { 2809683Slinton shellline(); 2819683Slinton $$ = nil; 2829683Slinton } 2839683Slinton | 2849683Slinton SOURCE shellmode filename 2859683Slinton { 2869683Slinton $$ = build(O_SOURCE, $3); 2879683Slinton } 2889683Slinton | 2899683Slinton step 2909683Slinton { 2919683Slinton $$ = $1; 2929683Slinton } 2939683Slinton | 2949683Slinton stop where opt_cond 2959683Slinton { 2969683Slinton $$ = build($1, nil, $2, $3); 2979683Slinton } 2989683Slinton | 2999683Slinton stop what opt_cond 3009683Slinton { 3019683Slinton $$ = build($1, $2, nil, $3); 3029683Slinton } 3039683Slinton | 3049683Slinton stop IF boolean_exp 3059683Slinton { 3069683Slinton $$ = build($1, nil, nil, $3); 3079683Slinton } 3089683Slinton | 3099683Slinton trace what where opt_cond 3109683Slinton { 3119683Slinton $$ = build($1, $2, $3, $4); 3129683Slinton } 3139683Slinton | 3149683Slinton trace where opt_cond 3159683Slinton { 3169683Slinton $$ = build($1, nil, $2, $3); 3179683Slinton } 3189683Slinton | 3199683Slinton trace what opt_cond 3209683Slinton { 3219683Slinton $$ = build($1, $2, nil, $3); 3229683Slinton } 3239683Slinton | 3249683Slinton trace opt_cond 3259683Slinton { 3269683Slinton $$ = build($1, nil, nil, $2); 3279683Slinton } 3289683Slinton | 32918214Slinton UNALIAS name 33018214Slinton { 33118214Slinton $$ = build(O_UNALIAS, build(O_NAME, $2)); 33218214Slinton } 33318214Slinton | 33418214Slinton UNSET name 33518214Slinton { 33618214Slinton $$ = build(O_UNSET, build(O_NAME, $2)); 33718214Slinton } 33818214Slinton | 33916607Ssam UP 3409683Slinton { 34116607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 3429683Slinton } 3439683Slinton | 34416607Ssam UP INT 3459683Slinton { 34616607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3479683Slinton } 3489683Slinton | 3499683Slinton USE shellmode sourcepath 3509683Slinton { 35114673Slinton String dir; 35214673Slinton 3539683Slinton $$ = nil; 35414673Slinton if (list_size($3) == 0) { 35514673Slinton foreach (String, dir, sourcepath) 35614673Slinton printf("%s ", dir); 35714673Slinton endfor 35814673Slinton printf("\n"); 35914673Slinton } else { 36014673Slinton foreach (String, dir, sourcepath) 36114673Slinton list_delete(list_curitem(sourcepath), sourcepath); 36214673Slinton endfor 36314673Slinton sourcepath = $3; 3649683Slinton } 3659683Slinton } 36616604Ssam | 36718214Slinton WHATIS opt_qual_symbol 36816604Ssam { 36918214Slinton $$ = build(O_WHATIS, $2); 37016604Ssam } 37116607Ssam | 37218214Slinton WHEN event '{' actions '}' 37316604Ssam { 37418214Slinton $$ = build(O_ADDEVENT, $2, $4); 37516604Ssam } 37616604Ssam | 37718214Slinton WHEREIS name 37816604Ssam { 37918214Slinton $$ = build(O_WHEREIS, build(O_SYM, lookup($2))); 38016604Ssam } 38116607Ssam | 38218214Slinton WHICH symbol 38316604Ssam { 38418214Slinton $$ = build(O_WHICH, $2); 38516604Ssam } 38616625Ssam | 38718214Slinton '/' 38816625Ssam { 38918214Slinton $$ = build(O_SEARCH, 39018214Slinton build(O_LCON, (long) '/'), 39118214Slinton build(O_SCON, strdup(scanner_linebuf)) 39218214Slinton ); 39318214Slinton gobble(); 39418214Slinton insertinput("\n"); 39516625Ssam } 39616625Ssam | 39718214Slinton '?' 39816625Ssam { 39918214Slinton $$ = build(O_SEARCH, 40018214Slinton build(O_LCON, (long) '?'), 40118214Slinton build(O_SCON, strdup(scanner_linebuf)) 40218214Slinton ); 40318214Slinton gobble(); 40418214Slinton insertinput("\n"); 40516625Ssam } 40616625Ssam ; 40716926Ssam signal: 40816926Ssam INT 40916926Ssam { 41018214Slinton $$ = $1; 41116926Ssam } 41216926Ssam | 41318214Slinton name 41416926Ssam { 41518214Slinton $$ = siglookup(ident($1)); 41616926Ssam } 41716926Ssam ; 4189683Slinton runcommand: 41916607Ssam run arglist 42012482Slinton | 42112524Slinton run 4229683Slinton ; 4239683Slinton run: 42412524Slinton RUN shellmode 4259683Slinton { 42616607Ssam arginit(); 4279683Slinton fflush(stdout); 4289683Slinton } 42916607Ssam | 43016607Ssam RERUN shellmode 43116607Ssam { 43216607Ssam fflush(stdout); 43316607Ssam } 4349683Slinton ; 4359683Slinton arglist: 4369683Slinton arglist arg 4379683Slinton | 43812482Slinton arg 4399683Slinton ; 4409683Slinton arg: 44118214Slinton NAME 4429683Slinton { 4439683Slinton newarg(ident($1)); 4449683Slinton } 4459683Slinton | 44618214Slinton STRING 44716607Ssam { 44816607Ssam newarg($1); 44916607Ssam } 45016607Ssam | 4519683Slinton '<' NAME 4529683Slinton { 4539683Slinton inarg(ident($2)); 4549683Slinton } 4559683Slinton | 4569683Slinton '>' NAME 4579683Slinton { 4589683Slinton outarg(ident($2)); 4599683Slinton } 4609683Slinton ; 4619683Slinton step: 46218214Slinton STEP 4639683Slinton { 4649683Slinton $$ = build(O_STEP, true, false); 4659683Slinton } 4669683Slinton | 46718214Slinton STEPI 4689683Slinton { 4699683Slinton $$ = build(O_STEP, false, false); 4709683Slinton } 4719683Slinton | 47218214Slinton NEXT 4739683Slinton { 4749683Slinton $$ = build(O_STEP, true, true); 4759683Slinton } 4769683Slinton | 47718214Slinton NEXTI 4789683Slinton { 4799683Slinton $$ = build(O_STEP, false, true); 4809683Slinton } 4819683Slinton ; 4829683Slinton shellmode: 4839683Slinton /* empty */ 4849683Slinton { 4859683Slinton beginshellmode(); 4869683Slinton } 4879683Slinton ; 4889683Slinton sourcepath: 4899683Slinton sourcepath NAME 4909683Slinton { 49114673Slinton $$ = $1; 49214673Slinton list_append(list_item(ident($2)), nil, $$); 4939683Slinton } 4949683Slinton | 4959683Slinton /* empty */ 4969683Slinton { 49714673Slinton $$ = list_alloc(); 4989683Slinton } 4999683Slinton ; 5009683Slinton event: 5019683Slinton where 5029683Slinton | 5039683Slinton exp 5049683Slinton ; 5059683Slinton actions: 5069683Slinton actions cmd ';' 5079683Slinton { 5089683Slinton $$ = $1; 5099683Slinton cmdlist_append($2, $$); 5109683Slinton } 5119683Slinton | 5129683Slinton cmd ';' 5139683Slinton { 5149683Slinton $$ = list_alloc(); 5159683Slinton cmdlist_append($1, $$); 5169683Slinton } 5179683Slinton ; 5189683Slinton cmd: 5199683Slinton command 5209683Slinton | 5219683Slinton rcommand 5229683Slinton ; 5239683Slinton 5249683Slinton /* 5259683Slinton * Redirectable commands. 5269683Slinton */ 5279683Slinton rcommand: 52818214Slinton PRINT exp_list 5299683Slinton { 53018214Slinton $$ = build(O_PRINT, $2); 5319683Slinton } 5329683Slinton | 5339683Slinton WHERE 5349683Slinton { 5359683Slinton $$ = build(O_WHERE); 5369683Slinton } 5379683Slinton | 5389683Slinton examine 5399683Slinton { 5409683Slinton $$ = $1; 5419683Slinton } 5429683Slinton | 54318214Slinton CALL term '(' opt_exp_list ')' 5449683Slinton { 54518214Slinton $$ = build(O_CALLPROC, $2, $4); 5469683Slinton } 5479683Slinton | 54812536Scsvaf DEBUG INT 54912536Scsvaf { 55012536Scsvaf $$ = build(O_DEBUG, $2); 55112536Scsvaf } 55212536Scsvaf | 55318214Slinton DEBUG '-' INT 55418214Slinton { 55518214Slinton $$ = build(O_DEBUG, -$3); 55618214Slinton } 55718214Slinton | 55818214Slinton DUMP opt_qual_symbol 55918214Slinton { 56018214Slinton $$ = build(O_DUMP, $2); 56118214Slinton } 56218214Slinton | 56318214Slinton DUMP '.' 56418214Slinton { 56518214Slinton $$ = build(O_DUMP, nil); 56618214Slinton } 56718214Slinton | 5689683Slinton DUMP 5699683Slinton { 57018214Slinton $$ = build(O_DUMP, build(O_SYM, curfunc)); 5719683Slinton } 5729683Slinton | 5739683Slinton STATUS 5749683Slinton { 5759683Slinton $$ = build(O_STATUS); 5769683Slinton } 5779683Slinton ; 5789683Slinton alias_command: 57918214Slinton ALIAS name name 5809683Slinton { 58118214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 5829683Slinton } 5839683Slinton | 58418214Slinton ALIAS name STRING 5859683Slinton { 58618214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_SCON, $3)); 58718214Slinton } 58818214Slinton | 58918214Slinton ALIAS name '(' name_list ')' STRING 59018214Slinton { 59118214Slinton $$ = build(O_ALIAS, 59218214Slinton build(O_COMMA, build(O_NAME, $2), (Node) $4), 59318214Slinton build(O_SCON, $6) 59418214Slinton ); 59518214Slinton } 59618214Slinton | 59718214Slinton ALIAS name 59818214Slinton { 5999683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 6009683Slinton } 6019683Slinton | 60218214Slinton ALIAS 6039683Slinton { 6049683Slinton $$ = build(O_ALIAS, nil, nil); 6059683Slinton } 6069683Slinton ; 60718214Slinton name_list: 60818214Slinton name_list ',' name 60916926Ssam { 61018214Slinton $$ = $1; 61118214Slinton list_append(list_item($3), nil, $$); 61216926Ssam } 61318214Slinton | 61418214Slinton name 61518214Slinton { 61618214Slinton $$ = list_alloc(); 61718214Slinton list_append(list_item($1), nil, $$); 61818214Slinton } 61916926Ssam ; 6209683Slinton trace: 62118214Slinton TRACE 6229683Slinton { 6239683Slinton $$ = O_TRACE; 6249683Slinton } 6259683Slinton | 62618214Slinton TRACEI 6279683Slinton { 6289683Slinton $$ = O_TRACEI; 6299683Slinton } 6309683Slinton ; 6319683Slinton stop: 63218214Slinton STOP 6339683Slinton { 6349683Slinton $$ = O_STOP; 6359683Slinton } 6369683Slinton | 63718214Slinton STOPI 6389683Slinton { 6399683Slinton $$ = O_STOPI; 6409683Slinton } 6419683Slinton ; 6429683Slinton what: 6439683Slinton exp 6449683Slinton { 6459683Slinton $$ = $1; 6469683Slinton } 6479683Slinton | 6489683Slinton STRING ':' line_number 6499683Slinton { 6509683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 6519683Slinton } 6529683Slinton ; 6539683Slinton where: 65418214Slinton IN exp 6559683Slinton { 65618214Slinton $$ = unrval($2); 6579683Slinton } 6589683Slinton | 6599683Slinton AT line_number 6609683Slinton { 66118214Slinton $$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2); 6629683Slinton } 6639683Slinton | 6649683Slinton AT STRING ':' line_number 6659683Slinton { 6669683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 6679683Slinton } 6689683Slinton ; 6699683Slinton filename: 6709683Slinton NAME 6719683Slinton { 6729683Slinton $$ = ident($1); 6739683Slinton } 6749683Slinton ; 6759683Slinton opt_filename: 6769683Slinton /* empty */ 6779683Slinton { 6789683Slinton $$ = nil; 6799683Slinton } 6809683Slinton | 6819683Slinton filename 6829683Slinton { 6839683Slinton $$ = $1; 6849683Slinton } 6859683Slinton ; 68612482Slinton opt_exp_list: 68712482Slinton exp_list 6889683Slinton { 68912482Slinton $$ = $1; 6909683Slinton } 6919683Slinton | 69212482Slinton /* empty */ 6939683Slinton { 69412482Slinton $$ = nil; 6959683Slinton } 6969683Slinton ; 6979683Slinton list_command: 69818214Slinton LIST 6999683Slinton { 7009683Slinton $$ = build(O_LIST, 7019683Slinton build(O_LCON, (long) cursrcline), 70233312Sdonn build(O_LCON, (long) cursrcline + srcwindowlen() - 1) 7039683Slinton ); 7049683Slinton } 7059683Slinton | 70618214Slinton LIST line_number 7079683Slinton { 7089683Slinton $$ = build(O_LIST, $2, $2); 7099683Slinton } 7109683Slinton | 71118214Slinton LIST line_number ',' line_number 7129683Slinton { 7139683Slinton $$ = build(O_LIST, $2, $4); 7149683Slinton } 7159683Slinton | 71618214Slinton LIST opt_qual_symbol 7179683Slinton { 71833312Sdonn $$ = build(O_LIST, $2, $2); 7199683Slinton } 7209683Slinton ; 72118214Slinton integer_list: 72218214Slinton INT 72318214Slinton { 72418214Slinton $$ = build(O_LCON, $1); 72518214Slinton } 72618214Slinton | 72718214Slinton INT integer_list 72818214Slinton { 72918214Slinton $$ = build(O_COMMA, build(O_LCON, $1), $2); 73018214Slinton } 73116607Ssam ; 7329683Slinton line_number: 7339683Slinton INT 7349683Slinton { 7359683Slinton $$ = build(O_LCON, $1); 7369683Slinton } 7379683Slinton | 7389683Slinton '$' 7399683Slinton { 7409683Slinton $$ = build(O_LCON, (long) LASTLINE); 7419683Slinton } 7429683Slinton ; 7439683Slinton examine: 7449683Slinton address '/' count mode 7459683Slinton { 7469683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 7479683Slinton } 7489683Slinton | 7499683Slinton address ',' address '/' mode 7509683Slinton { 7519683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 7529683Slinton } 7539683Slinton | 75411173Slinton address '=' mode 75511173Slinton { 75611173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 75711173Slinton } 7589683Slinton ; 7599683Slinton address: 76018214Slinton INT 7619683Slinton { 7629683Slinton $$ = build(O_LCON, $1); 7639683Slinton } 7649683Slinton | 76518214Slinton '.' 7669683Slinton { 76718214Slinton $$ = build(O_LCON, (long) prtaddr); 7689683Slinton } 7699683Slinton | 77018214Slinton '&' term 77118214Slinton { 77218214Slinton $$ = amper($2); 77318214Slinton } 77418214Slinton | 7759683Slinton address '+' address 7769683Slinton { 7779683Slinton $$ = build(O_ADD, $1, $3); 7789683Slinton } 7799683Slinton | 7809683Slinton address '-' address 7819683Slinton { 7829683Slinton $$ = build(O_SUB, $1, $3); 7839683Slinton } 7849683Slinton | 7859683Slinton address '*' address 7869683Slinton { 7879683Slinton $$ = build(O_MUL, $1, $3); 7889683Slinton } 7899683Slinton | 79018214Slinton '*' address %prec UNARYSIGN 7919683Slinton { 79218214Slinton $$ = build(O_INDIR, $2); 7939683Slinton } 7949683Slinton | 79518214Slinton '-' address %prec UNARYSIGN 7969683Slinton { 79718214Slinton $$ = build(O_NEG, $2); 7989683Slinton } 79918214Slinton | 80018214Slinton '(' exp ')' 80118214Slinton { 80218214Slinton $$ = $2; 80318214Slinton } 8049683Slinton ; 80518214Slinton term: 80618214Slinton symbol 80718214Slinton { 80818214Slinton $$ = $1; 80918214Slinton } 81018214Slinton | 81118214Slinton term '.' name 81218214Slinton { 81318214Slinton $$ = unrval(dot($1, $3)); 81418214Slinton } 81518214Slinton | 81618214Slinton term ARROW name 81718214Slinton { 81818214Slinton $$ = unrval(dot($1, $3)); 81918214Slinton } 82018214Slinton | 82118214Slinton term '[' exp_list ']' 82218214Slinton { 82318214Slinton $$ = unrval(subscript($1, $3)); 82418214Slinton } 82518214Slinton ; 8269683Slinton count: 8279683Slinton /* empty */ 8289683Slinton { 8299683Slinton $$ = 1; 8309683Slinton } 8319683Slinton | 8329683Slinton INT 8339683Slinton { 8349683Slinton $$ = $1; 8359683Slinton } 8369683Slinton ; 8379683Slinton mode: 8389683Slinton name 8399683Slinton { 8409683Slinton $$ = ident($1); 8419683Slinton curformat = $$; 8429683Slinton } 8439683Slinton | 8449683Slinton /* empty */ 8459683Slinton { 8469683Slinton $$ = curformat; 8479683Slinton } 8489683Slinton ; 8499683Slinton opt_cond: 8509683Slinton /* empty */ 8519683Slinton { 8529683Slinton $$ = nil; 8539683Slinton } 8549683Slinton | 8559683Slinton IF boolean_exp 8569683Slinton { 8579683Slinton $$ = $2; 8589683Slinton } 8599683Slinton ; 8609683Slinton exp_list: 8619683Slinton exp 8629683Slinton { 8639683Slinton $$ = build(O_COMMA, $1, nil); 8649683Slinton } 8659683Slinton | 8669683Slinton exp ',' exp_list 8679683Slinton { 8689683Slinton $$ = build(O_COMMA, $1, $3); 8699683Slinton } 8709683Slinton ; 8719683Slinton exp: 87218214Slinton symbol 8739683Slinton { 8749683Slinton $$ = build(O_RVAL, $1); 8759683Slinton } 8769683Slinton | 87718214Slinton exp '[' exp_list ']' 8789683Slinton { 87918214Slinton $$ = subscript(unrval($1), $3); 8809683Slinton } 8819683Slinton | 88218214Slinton exp '.' name 88318214Slinton { 88418214Slinton $$ = dot($1, $3); 88518214Slinton } 88618214Slinton | 88718214Slinton exp ARROW name 88818214Slinton { 88918214Slinton $$ = dot($1, $3); 89018214Slinton } 89118214Slinton | 89218214Slinton '*' exp %prec UNARYSIGN 89318214Slinton { 89418214Slinton $$ = build(O_INDIR, $2); 89518214Slinton } 89618214Slinton | 89718214Slinton exp '^' %prec UNARYSIGN 89818214Slinton { 89918214Slinton $$ = build(O_INDIR, $1); 90018214Slinton } 90118214Slinton | 90216607Ssam exp '\\' opt_qual_symbol 90311173Slinton { 90411173Slinton $$ = build(O_TYPERENAME, $1, $3); 90511173Slinton } 90611173Slinton | 90718214Slinton exp '\\' '&' opt_qual_symbol %prec '\\' 90818214Slinton { 90918214Slinton $$ = renameptr($1, $4); 91018214Slinton } 91118214Slinton | 91218214Slinton exp '(' opt_exp_list ')' 91318214Slinton { 91418214Slinton $$ = build(O_CALL, unrval($1), $3); 91518214Slinton } 91618214Slinton | 91718214Slinton constant 91818214Slinton { 91918214Slinton $$ = $1; 92018214Slinton } 92118214Slinton | 9229683Slinton '+' exp %prec UNARYSIGN 9239683Slinton { 9249683Slinton $$ = $2; 9259683Slinton } 9269683Slinton | 9279683Slinton '-' exp %prec UNARYSIGN 9289683Slinton { 9299683Slinton $$ = build(O_NEG, $2); 9309683Slinton } 9319683Slinton | 9329683Slinton '&' exp %prec UNARYSIGN 9339683Slinton { 9349683Slinton $$ = amper($2); 9359683Slinton } 9369683Slinton | 9379683Slinton exp '+' exp 9389683Slinton { 9399683Slinton $$ = build(O_ADD, $1, $3); 9409683Slinton } 9419683Slinton | 9429683Slinton exp '-' exp 9439683Slinton { 9449683Slinton $$ = build(O_SUB, $1, $3); 9459683Slinton } 9469683Slinton | 9479683Slinton exp '*' exp 9489683Slinton { 9499683Slinton $$ = build(O_MUL, $1, $3); 9509683Slinton } 9519683Slinton | 9529683Slinton exp '/' exp 9539683Slinton { 9549683Slinton $$ = build(O_DIVF, $1, $3); 9559683Slinton } 9569683Slinton | 9579683Slinton exp DIV exp 9589683Slinton { 9599683Slinton $$ = build(O_DIV, $1, $3); 9609683Slinton } 9619683Slinton | 9629683Slinton exp MOD exp 9639683Slinton { 9649683Slinton $$ = build(O_MOD, $1, $3); 9659683Slinton } 9669683Slinton | 9679683Slinton exp AND exp 9689683Slinton { 9699683Slinton $$ = build(O_AND, $1, $3); 9709683Slinton } 9719683Slinton | 9729683Slinton exp OR exp 9739683Slinton { 9749683Slinton $$ = build(O_OR, $1, $3); 9759683Slinton } 9769683Slinton | 9779683Slinton exp '<' exp 9789683Slinton { 9799683Slinton $$ = build(O_LT, $1, $3); 9809683Slinton } 9819683Slinton | 9829683Slinton exp '<' '=' exp 9839683Slinton { 9849683Slinton $$ = build(O_LE, $1, $4); 9859683Slinton } 9869683Slinton | 9879683Slinton exp '>' exp 9889683Slinton { 9899683Slinton $$ = build(O_GT, $1, $3); 9909683Slinton } 9919683Slinton | 9929683Slinton exp '>' '=' exp 9939683Slinton { 9949683Slinton $$ = build(O_GE, $1, $4); 9959683Slinton } 9969683Slinton | 9979683Slinton exp '=' exp 9989683Slinton { 9999683Slinton $$ = build(O_EQ, $1, $3); 10009683Slinton } 10019683Slinton | 10029683Slinton exp '=' '=' exp 10039683Slinton { 10049683Slinton $$ = build(O_EQ, $1, $4); 10059683Slinton } 10069683Slinton | 10079683Slinton exp '<' '>' exp 10089683Slinton { 10099683Slinton $$ = build(O_NE, $1, $4); 10109683Slinton } 10119683Slinton | 10129683Slinton exp '!' '=' exp 10139683Slinton { 10149683Slinton $$ = build(O_NE, $1, $4); 10159683Slinton } 10169683Slinton | 10179683Slinton '(' exp ')' 10189683Slinton { 10199683Slinton $$ = $2; 10209683Slinton } 10219683Slinton ; 10229683Slinton boolean_exp: 10239683Slinton exp 10249683Slinton { 10259683Slinton chkboolean($1); 10269683Slinton $$ = $1; 10279683Slinton } 10289683Slinton ; 10299683Slinton constant: 10309683Slinton INT 10319683Slinton { 10329683Slinton $$ = build(O_LCON, $1); 10339683Slinton } 10349683Slinton | 103518214Slinton CHAR 103618214Slinton { 103718214Slinton $$ = build(O_CCON, $1); 103818214Slinton } 103918214Slinton | 10409683Slinton REAL 10419683Slinton { 10429683Slinton $$ = build(O_FCON, $1); 10439683Slinton } 10449683Slinton | 10459683Slinton STRING 10469683Slinton { 10479683Slinton $$ = build(O_SCON, $1); 10489683Slinton } 10499683Slinton ; 105016607Ssam opt_qual_symbol: 105116607Ssam symbol 105216607Ssam { 105316607Ssam $$ = $1; 105416607Ssam } 105516607Ssam | 105616607Ssam opt_qual_symbol '.' name 105716607Ssam { 105816607Ssam $$ = dot($1, $3); 105916607Ssam } 106016607Ssam ; 10619683Slinton symbol: 10629683Slinton name 10639683Slinton { 106418214Slinton $$ = findvar($1); 106518214Slinton if ($$ == nil) { 106618214Slinton $$ = build(O_SYM, which($1)); 106718214Slinton } 10689683Slinton } 106916607Ssam | 107016607Ssam '.' name 107116607Ssam { 107216607Ssam $$ = dot(build(O_SYM, program), $2); 107316607Ssam } 10749683Slinton ; 10759683Slinton name: 10769683Slinton NAME 10779683Slinton { 10789683Slinton $$ = $1; 10799683Slinton } 10809683Slinton | 10819683Slinton keyword 10829683Slinton { 10839683Slinton $$ = $1; 10849683Slinton } 10859683Slinton keyword: 108612536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 108716607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 108816607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 108918214Slinton RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 109018214Slinton STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE | 109118214Slinton WHATIS | WHEN | WHERE | WHEREIS | WHICH 10929683Slinton ; 1093