19683Slinton %{ 2*18214Slinton 39683Slinton /* Copyright (c) 1982 Regents of the University of California */ 49683Slinton 5*18214Slinton static char sccsid[] = "@(#)commands.y 1.14 (Berkeley) 03/01/85"; 69683Slinton 7*18214Slinton static char rcsid[] = "$Header: commands.y,v 1.5 84/12/26 10:38:41 linton Exp $"; 8*18214Slinton 99683Slinton /* 109683Slinton * Yacc grammar for debugger commands. 119683Slinton */ 129683Slinton 139683Slinton #include "defs.h" 149683Slinton #include "symbols.h" 159683Slinton #include "operators.h" 169683Slinton #include "tree.h" 179683Slinton #include "process.h" 189683Slinton #include "source.h" 199683Slinton #include "scanner.h" 20*18214Slinton #include "keywords.h" 219683Slinton #include "names.h" 2214673Slinton #include "lists.h" 239683Slinton 249683Slinton private String curformat = "X"; 259683Slinton 269683Slinton %} 279683Slinton 289683Slinton %term 2916607Ssam ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP 309683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 31*18214Slinton PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS STEP STEPI 32*18214Slinton STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE 33*18214Slinton WHATIS WHEN WHERE WHEREIS WHICH 349683Slinton 35*18214Slinton %term INT CHAR REAL NAME STRING 36*18214Slinton %term ARROW 379683Slinton 389683Slinton %right INT 399683Slinton %binary REDIRECT 409683Slinton %binary '<' '=' '>' '!' IN 419683Slinton %left '+' '-' OR 429683Slinton %left UNARYSIGN 439683Slinton %left '*' '/' DIV MOD AND 44*18214Slinton %left '\\' 459683Slinton %left NOT '(' '[' '.' '^' ARROW 469683Slinton 479683Slinton %union { 489683Slinton Name y_name; 499683Slinton Symbol y_sym; 509683Slinton Node y_node; 519683Slinton Integer y_int; 529683Slinton Operator y_op; 539683Slinton long y_long; 54*18214Slinton char y_char; 559683Slinton double y_real; 569683Slinton String y_string; 579683Slinton Boolean y_bool; 589683Slinton Cmdlist y_cmdlist; 5914673Slinton List y_list; 609683Slinton }; 619683Slinton 629683Slinton %type <y_op> trace stop 63*18214Slinton %type <y_long> INT count signal 64*18214Slinton %type <y_char> CHAR 659683Slinton %type <y_real> REAL 669683Slinton %type <y_string> STRING redirectout filename opt_filename mode 6716607Ssam %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT 6816607Ssam %type <y_name> DEBUG DELETE DIV DOWN DUMP 699683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 709683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 71*18214Slinton %type <y_name> PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS 7216607Ssam %type <y_name> STEP STEPI STOP STOPI TRACE TRACEI 73*18214Slinton %type <y_name> UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH 749683Slinton %type <y_name> name NAME keyword 7516607Ssam %type <y_node> opt_qual_symbol symbol 769683Slinton %type <y_node> command rcommand cmd step what where examine 7712482Slinton %type <y_node> event opt_exp_list opt_cond 789683Slinton %type <y_node> exp_list exp term boolean_exp constant address 7916934Ssam %type <y_node> integer_list alias_command list_command line_number 809683Slinton %type <y_cmdlist> actions 81*18214Slinton %type <y_list> sourcepath name_list 829683Slinton 839683Slinton %% 849683Slinton 859683Slinton input: 869683Slinton input command_nl 879683Slinton | 889683Slinton /* empty */ 899683Slinton ; 909683Slinton command_nl: 919683Slinton command_line '\n' 92*18214Slinton | 93*18214Slinton command_line ';' 9416926Ssam { 95*18214Slinton chkalias = true; 9616926Ssam } 979683Slinton | 989683Slinton '\n' 999683Slinton ; 1009683Slinton 1019683Slinton command_line: 1029683Slinton command 1039683Slinton { 1049683Slinton if ($1 != nil) { 105*18214Slinton topeval($1); 1069683Slinton } 1079683Slinton } 1089683Slinton | 1099683Slinton rcommand redirectout 1109683Slinton { 1119683Slinton if ($1 != nil) { 1129683Slinton if ($2 != nil) { 1139683Slinton setout($2); 114*18214Slinton topeval($1); 1159683Slinton unsetout(); 1169683Slinton } else { 117*18214Slinton topeval($1); 1189683Slinton } 1199683Slinton } 1209683Slinton } 1219683Slinton ; 1229683Slinton redirectout: 1239683Slinton '>' shellmode NAME 1249683Slinton { 1259683Slinton $$ = ident($3); 1269683Slinton } 1279683Slinton | 1289683Slinton /* empty */ 1299683Slinton { 1309683Slinton $$ = nil; 1319683Slinton } 1329683Slinton ; 1339683Slinton 1349683Slinton /* 1359683Slinton * Non-redirectable commands. 1369683Slinton */ 1379683Slinton command: 1389683Slinton alias_command 1399683Slinton { 1409683Slinton $$ = $1; 1419683Slinton } 1429683Slinton | 143*18214Slinton ASSIGN exp '=' exp 1449683Slinton { 145*18214Slinton $$ = build(O_ASSIGN, unrval($2), $4); 1469683Slinton } 1479683Slinton | 148*18214Slinton CATCH signal 1499683Slinton { 150*18214Slinton $$ = build(O_CATCH, $2); 1519683Slinton } 1529683Slinton | 153*18214Slinton CATCH 15416926Ssam { 155*18214Slinton $$ = build(O_CATCH, 0); 15616926Ssam } 15716926Ssam | 1589683Slinton CONT 1599683Slinton { 16014673Slinton $$ = build(O_CONT, (long) DEFSIG); 1619683Slinton } 1629683Slinton | 163*18214Slinton CONT signal 16411870Slinton { 16511870Slinton $$ = build(O_CONT, $2); 16611870Slinton } 16711870Slinton | 16816934Ssam DELETE integer_list 1699683Slinton { 1709683Slinton $$ = build(O_DELETE, $2); 1719683Slinton } 1729683Slinton | 17316607Ssam DOWN 17416607Ssam { 17516607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 17616607Ssam } 17716607Ssam | 17816607Ssam DOWN INT 17916607Ssam { 18016607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 18116607Ssam } 18216607Ssam | 1839683Slinton EDIT shellmode opt_filename 1849683Slinton { 1859683Slinton $$ = build(O_EDIT, $3); 1869683Slinton } 1879683Slinton | 1889683Slinton FILE shellmode opt_filename 1899683Slinton { 1909683Slinton $$ = build(O_CHFILE, $3); 1919683Slinton } 1929683Slinton | 1939683Slinton FUNC 1949683Slinton { 1959683Slinton $$ = build(O_FUNC, nil); 1969683Slinton } 1979683Slinton | 198*18214Slinton FUNC opt_qual_symbol 1999683Slinton { 200*18214Slinton $$ = build(O_FUNC, $2); 2019683Slinton } 2029683Slinton | 2039683Slinton GRIPE 2049683Slinton { 2059683Slinton $$ = build(O_GRIPE); 2069683Slinton } 2079683Slinton | 2089683Slinton HELP 2099683Slinton { 2109683Slinton $$ = build(O_HELP); 2119683Slinton } 2129683Slinton | 213*18214Slinton IGNORE signal 2149683Slinton { 215*18214Slinton $$ = build(O_IGNORE, $2); 2169683Slinton } 2179683Slinton | 218*18214Slinton IGNORE 21916926Ssam { 220*18214Slinton $$ = build(O_IGNORE, 0); 22116926Ssam } 22216926Ssam | 2239683Slinton list_command 2249683Slinton { 2259683Slinton $$ = $1; 2269683Slinton } 2279683Slinton | 228*18214Slinton PSYM exp 2299683Slinton { 230*18214Slinton $$ = build(O_PSYM, unrval($2)); 2319683Slinton } 2329683Slinton | 2339683Slinton QUIT 2349683Slinton { 2359683Slinton if (not popinput()) { 2369683Slinton quit(0); 2379683Slinton } else { 2389683Slinton $$ = nil; 2399683Slinton } 2409683Slinton } 2419683Slinton | 24216607Ssam RETURN 24316607Ssam { 24416607Ssam $$ = build(O_RETURN, nil); 24516607Ssam } 24616607Ssam | 247*18214Slinton RETURN opt_qual_symbol 24816607Ssam { 249*18214Slinton $$ = build(O_RETURN, $2); 25016607Ssam } 25116607Ssam | 2529683Slinton runcommand 2539683Slinton { 2549683Slinton run(); 2559683Slinton /* NOTREACHED */ 2569683Slinton } 2579683Slinton | 258*18214Slinton SET name '=' exp 259*18214Slinton { 260*18214Slinton $$ = build(O_SET, build(O_NAME, $2), $4); 261*18214Slinton } 262*18214Slinton | 263*18214Slinton SET name 264*18214Slinton { 265*18214Slinton $$ = build(O_SET, build(O_NAME, $2), nil); 266*18214Slinton } 267*18214Slinton | 268*18214Slinton SET 269*18214Slinton { 270*18214Slinton $$ = build(O_SET, nil, nil); 271*18214Slinton } 272*18214Slinton | 2739683Slinton SH 2749683Slinton { 2759683Slinton shellline(); 2769683Slinton $$ = nil; 2779683Slinton } 2789683Slinton | 2799683Slinton SOURCE shellmode filename 2809683Slinton { 2819683Slinton $$ = build(O_SOURCE, $3); 2829683Slinton } 2839683Slinton | 2849683Slinton step 2859683Slinton { 2869683Slinton $$ = $1; 2879683Slinton } 2889683Slinton | 2899683Slinton stop where opt_cond 2909683Slinton { 2919683Slinton $$ = build($1, nil, $2, $3); 2929683Slinton } 2939683Slinton | 2949683Slinton stop what opt_cond 2959683Slinton { 2969683Slinton $$ = build($1, $2, nil, $3); 2979683Slinton } 2989683Slinton | 2999683Slinton stop IF boolean_exp 3009683Slinton { 3019683Slinton $$ = build($1, nil, nil, $3); 3029683Slinton } 3039683Slinton | 3049683Slinton trace what where opt_cond 3059683Slinton { 3069683Slinton $$ = build($1, $2, $3, $4); 3079683Slinton } 3089683Slinton | 3099683Slinton trace where opt_cond 3109683Slinton { 3119683Slinton $$ = build($1, nil, $2, $3); 3129683Slinton } 3139683Slinton | 3149683Slinton trace what opt_cond 3159683Slinton { 3169683Slinton $$ = build($1, $2, nil, $3); 3179683Slinton } 3189683Slinton | 3199683Slinton trace opt_cond 3209683Slinton { 3219683Slinton $$ = build($1, nil, nil, $2); 3229683Slinton } 3239683Slinton | 324*18214Slinton UNALIAS name 325*18214Slinton { 326*18214Slinton $$ = build(O_UNALIAS, build(O_NAME, $2)); 327*18214Slinton } 328*18214Slinton | 329*18214Slinton UNSET name 330*18214Slinton { 331*18214Slinton $$ = build(O_UNSET, build(O_NAME, $2)); 332*18214Slinton } 333*18214Slinton | 33416607Ssam UP 3359683Slinton { 33616607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 3379683Slinton } 3389683Slinton | 33916607Ssam UP INT 3409683Slinton { 34116607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3429683Slinton } 3439683Slinton | 3449683Slinton USE shellmode sourcepath 3459683Slinton { 34614673Slinton String dir; 34714673Slinton 3489683Slinton $$ = nil; 34914673Slinton if (list_size($3) == 0) { 35014673Slinton foreach (String, dir, sourcepath) 35114673Slinton printf("%s ", dir); 35214673Slinton endfor 35314673Slinton printf("\n"); 35414673Slinton } else { 35514673Slinton foreach (String, dir, sourcepath) 35614673Slinton list_delete(list_curitem(sourcepath), sourcepath); 35714673Slinton endfor 35814673Slinton sourcepath = $3; 3599683Slinton } 3609683Slinton } 36116604Ssam | 362*18214Slinton WHATIS opt_qual_symbol 36316604Ssam { 364*18214Slinton $$ = build(O_WHATIS, $2); 36516604Ssam } 36616607Ssam | 367*18214Slinton WHEN event '{' actions '}' 36816604Ssam { 369*18214Slinton $$ = build(O_ADDEVENT, $2, $4); 37016604Ssam } 37116604Ssam | 372*18214Slinton WHEREIS name 37316604Ssam { 374*18214Slinton $$ = build(O_WHEREIS, build(O_SYM, lookup($2))); 37516604Ssam } 37616607Ssam | 377*18214Slinton WHICH symbol 37816604Ssam { 379*18214Slinton $$ = build(O_WHICH, $2); 38016604Ssam } 38116625Ssam | 382*18214Slinton '/' 38316625Ssam { 384*18214Slinton $$ = build(O_SEARCH, 385*18214Slinton build(O_LCON, (long) '/'), 386*18214Slinton build(O_SCON, strdup(scanner_linebuf)) 387*18214Slinton ); 388*18214Slinton gobble(); 389*18214Slinton insertinput("\n"); 39016625Ssam } 39116625Ssam | 392*18214Slinton '?' 39316625Ssam { 394*18214Slinton $$ = build(O_SEARCH, 395*18214Slinton build(O_LCON, (long) '?'), 396*18214Slinton build(O_SCON, strdup(scanner_linebuf)) 397*18214Slinton ); 398*18214Slinton gobble(); 399*18214Slinton insertinput("\n"); 40016625Ssam } 40116625Ssam ; 40216926Ssam signal: 40316926Ssam INT 40416926Ssam { 405*18214Slinton $$ = $1; 40616926Ssam } 40716926Ssam | 408*18214Slinton name 40916926Ssam { 410*18214Slinton $$ = siglookup(ident($1)); 41116926Ssam } 41216926Ssam ; 4139683Slinton runcommand: 41416607Ssam run arglist 41512482Slinton | 41612524Slinton run 4179683Slinton ; 4189683Slinton run: 41912524Slinton RUN shellmode 4209683Slinton { 42116607Ssam arginit(); 4229683Slinton fflush(stdout); 4239683Slinton } 42416607Ssam | 42516607Ssam RERUN shellmode 42616607Ssam { 42716607Ssam fflush(stdout); 42816607Ssam } 4299683Slinton ; 4309683Slinton arglist: 4319683Slinton arglist arg 4329683Slinton | 43312482Slinton arg 4349683Slinton ; 4359683Slinton arg: 436*18214Slinton NAME 4379683Slinton { 4389683Slinton newarg(ident($1)); 4399683Slinton } 4409683Slinton | 441*18214Slinton STRING 44216607Ssam { 44316607Ssam newarg($1); 44416607Ssam } 44516607Ssam | 4469683Slinton '<' NAME 4479683Slinton { 4489683Slinton inarg(ident($2)); 4499683Slinton } 4509683Slinton | 4519683Slinton '>' NAME 4529683Slinton { 4539683Slinton outarg(ident($2)); 4549683Slinton } 4559683Slinton ; 4569683Slinton step: 457*18214Slinton STEP 4589683Slinton { 4599683Slinton $$ = build(O_STEP, true, false); 4609683Slinton } 4619683Slinton | 462*18214Slinton STEPI 4639683Slinton { 4649683Slinton $$ = build(O_STEP, false, false); 4659683Slinton } 4669683Slinton | 467*18214Slinton NEXT 4689683Slinton { 4699683Slinton $$ = build(O_STEP, true, true); 4709683Slinton } 4719683Slinton | 472*18214Slinton NEXTI 4739683Slinton { 4749683Slinton $$ = build(O_STEP, false, true); 4759683Slinton } 4769683Slinton ; 4779683Slinton shellmode: 4789683Slinton /* empty */ 4799683Slinton { 4809683Slinton beginshellmode(); 4819683Slinton } 4829683Slinton ; 4839683Slinton sourcepath: 4849683Slinton sourcepath NAME 4859683Slinton { 48614673Slinton $$ = $1; 48714673Slinton list_append(list_item(ident($2)), nil, $$); 4889683Slinton } 4899683Slinton | 4909683Slinton /* empty */ 4919683Slinton { 49214673Slinton $$ = list_alloc(); 4939683Slinton } 4949683Slinton ; 4959683Slinton event: 4969683Slinton where 4979683Slinton | 4989683Slinton exp 4999683Slinton ; 5009683Slinton actions: 5019683Slinton actions cmd ';' 5029683Slinton { 5039683Slinton $$ = $1; 5049683Slinton cmdlist_append($2, $$); 5059683Slinton } 5069683Slinton | 5079683Slinton cmd ';' 5089683Slinton { 5099683Slinton $$ = list_alloc(); 5109683Slinton cmdlist_append($1, $$); 5119683Slinton } 5129683Slinton ; 5139683Slinton cmd: 5149683Slinton command 5159683Slinton | 5169683Slinton rcommand 5179683Slinton ; 5189683Slinton 5199683Slinton /* 5209683Slinton * Redirectable commands. 5219683Slinton */ 5229683Slinton rcommand: 523*18214Slinton PRINT exp_list 5249683Slinton { 525*18214Slinton $$ = build(O_PRINT, $2); 5269683Slinton } 5279683Slinton | 5289683Slinton WHERE 5299683Slinton { 5309683Slinton $$ = build(O_WHERE); 5319683Slinton } 5329683Slinton | 5339683Slinton examine 5349683Slinton { 5359683Slinton $$ = $1; 5369683Slinton } 5379683Slinton | 538*18214Slinton CALL term '(' opt_exp_list ')' 5399683Slinton { 540*18214Slinton $$ = build(O_CALLPROC, $2, $4); 5419683Slinton } 5429683Slinton | 54312536Scsvaf DEBUG INT 54412536Scsvaf { 54512536Scsvaf $$ = build(O_DEBUG, $2); 54612536Scsvaf } 54712536Scsvaf | 548*18214Slinton DEBUG '-' INT 549*18214Slinton { 550*18214Slinton $$ = build(O_DEBUG, -$3); 551*18214Slinton } 552*18214Slinton | 553*18214Slinton DUMP opt_qual_symbol 554*18214Slinton { 555*18214Slinton $$ = build(O_DUMP, $2); 556*18214Slinton } 557*18214Slinton | 558*18214Slinton DUMP '.' 559*18214Slinton { 560*18214Slinton $$ = build(O_DUMP, nil); 561*18214Slinton } 562*18214Slinton | 5639683Slinton DUMP 5649683Slinton { 565*18214Slinton $$ = build(O_DUMP, build(O_SYM, curfunc)); 5669683Slinton } 5679683Slinton | 5689683Slinton STATUS 5699683Slinton { 5709683Slinton $$ = build(O_STATUS); 5719683Slinton } 5729683Slinton ; 5739683Slinton alias_command: 574*18214Slinton ALIAS name name 5759683Slinton { 576*18214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 5779683Slinton } 5789683Slinton | 579*18214Slinton ALIAS name STRING 5809683Slinton { 581*18214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_SCON, $3)); 582*18214Slinton } 583*18214Slinton | 584*18214Slinton ALIAS name '(' name_list ')' STRING 585*18214Slinton { 586*18214Slinton $$ = build(O_ALIAS, 587*18214Slinton build(O_COMMA, build(O_NAME, $2), (Node) $4), 588*18214Slinton build(O_SCON, $6) 589*18214Slinton ); 590*18214Slinton } 591*18214Slinton | 592*18214Slinton ALIAS name 593*18214Slinton { 5949683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 5959683Slinton } 5969683Slinton | 597*18214Slinton ALIAS 5989683Slinton { 5999683Slinton $$ = build(O_ALIAS, nil, nil); 6009683Slinton } 6019683Slinton ; 602*18214Slinton name_list: 603*18214Slinton name_list ',' name 60416926Ssam { 605*18214Slinton $$ = $1; 606*18214Slinton list_append(list_item($3), nil, $$); 60716926Ssam } 608*18214Slinton | 609*18214Slinton name 610*18214Slinton { 611*18214Slinton $$ = list_alloc(); 612*18214Slinton list_append(list_item($1), nil, $$); 613*18214Slinton } 61416926Ssam ; 6159683Slinton trace: 616*18214Slinton TRACE 6179683Slinton { 6189683Slinton $$ = O_TRACE; 6199683Slinton } 6209683Slinton | 621*18214Slinton TRACEI 6229683Slinton { 6239683Slinton $$ = O_TRACEI; 6249683Slinton } 6259683Slinton ; 6269683Slinton stop: 627*18214Slinton STOP 6289683Slinton { 6299683Slinton $$ = O_STOP; 6309683Slinton } 6319683Slinton | 632*18214Slinton STOPI 6339683Slinton { 6349683Slinton $$ = O_STOPI; 6359683Slinton } 6369683Slinton ; 6379683Slinton what: 6389683Slinton exp 6399683Slinton { 6409683Slinton $$ = $1; 6419683Slinton } 6429683Slinton | 6439683Slinton STRING ':' line_number 6449683Slinton { 6459683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 6469683Slinton } 6479683Slinton ; 6489683Slinton where: 649*18214Slinton IN exp 6509683Slinton { 651*18214Slinton $$ = unrval($2); 6529683Slinton } 6539683Slinton | 6549683Slinton AT line_number 6559683Slinton { 656*18214Slinton $$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2); 6579683Slinton } 6589683Slinton | 6599683Slinton AT STRING ':' line_number 6609683Slinton { 6619683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 6629683Slinton } 6639683Slinton ; 6649683Slinton filename: 6659683Slinton NAME 6669683Slinton { 6679683Slinton $$ = ident($1); 6689683Slinton } 6699683Slinton ; 6709683Slinton opt_filename: 6719683Slinton /* empty */ 6729683Slinton { 6739683Slinton $$ = nil; 6749683Slinton } 6759683Slinton | 6769683Slinton filename 6779683Slinton { 6789683Slinton $$ = $1; 6799683Slinton } 6809683Slinton ; 68112482Slinton opt_exp_list: 68212482Slinton exp_list 6839683Slinton { 68412482Slinton $$ = $1; 6859683Slinton } 6869683Slinton | 68712482Slinton /* empty */ 6889683Slinton { 68912482Slinton $$ = nil; 6909683Slinton } 6919683Slinton ; 6929683Slinton list_command: 693*18214Slinton LIST 6949683Slinton { 6959683Slinton $$ = build(O_LIST, 6969683Slinton build(O_LCON, (long) cursrcline), 6979683Slinton build(O_LCON, (long) cursrcline + 9) 6989683Slinton ); 6999683Slinton } 7009683Slinton | 701*18214Slinton LIST line_number 7029683Slinton { 7039683Slinton $$ = build(O_LIST, $2, $2); 7049683Slinton } 7059683Slinton | 706*18214Slinton LIST line_number ',' line_number 7079683Slinton { 7089683Slinton $$ = build(O_LIST, $2, $4); 7099683Slinton } 7109683Slinton | 711*18214Slinton LIST opt_qual_symbol 7129683Slinton { 713*18214Slinton $$ = build(O_LIST, $2); 7149683Slinton } 7159683Slinton ; 716*18214Slinton integer_list: 717*18214Slinton INT 718*18214Slinton { 719*18214Slinton $$ = build(O_LCON, $1); 720*18214Slinton } 721*18214Slinton | 722*18214Slinton INT integer_list 723*18214Slinton { 724*18214Slinton $$ = build(O_COMMA, build(O_LCON, $1), $2); 725*18214Slinton } 72616607Ssam ; 7279683Slinton line_number: 7289683Slinton INT 7299683Slinton { 7309683Slinton $$ = build(O_LCON, $1); 7319683Slinton } 7329683Slinton | 7339683Slinton '$' 7349683Slinton { 7359683Slinton $$ = build(O_LCON, (long) LASTLINE); 7369683Slinton } 7379683Slinton ; 7389683Slinton examine: 7399683Slinton address '/' count mode 7409683Slinton { 7419683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 7429683Slinton } 7439683Slinton | 7449683Slinton address ',' address '/' mode 7459683Slinton { 7469683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 7479683Slinton } 7489683Slinton | 74911173Slinton address '=' mode 75011173Slinton { 75111173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 75211173Slinton } 7539683Slinton ; 7549683Slinton address: 755*18214Slinton INT 7569683Slinton { 7579683Slinton $$ = build(O_LCON, $1); 7589683Slinton } 7599683Slinton | 760*18214Slinton '.' 7619683Slinton { 762*18214Slinton $$ = build(O_LCON, (long) prtaddr); 7639683Slinton } 7649683Slinton | 765*18214Slinton '&' term 766*18214Slinton { 767*18214Slinton $$ = amper($2); 768*18214Slinton } 769*18214Slinton | 7709683Slinton address '+' address 7719683Slinton { 7729683Slinton $$ = build(O_ADD, $1, $3); 7739683Slinton } 7749683Slinton | 7759683Slinton address '-' address 7769683Slinton { 7779683Slinton $$ = build(O_SUB, $1, $3); 7789683Slinton } 7799683Slinton | 7809683Slinton address '*' address 7819683Slinton { 7829683Slinton $$ = build(O_MUL, $1, $3); 7839683Slinton } 7849683Slinton | 785*18214Slinton '*' address %prec UNARYSIGN 7869683Slinton { 787*18214Slinton $$ = build(O_INDIR, $2); 7889683Slinton } 7899683Slinton | 790*18214Slinton '-' address %prec UNARYSIGN 7919683Slinton { 792*18214Slinton $$ = build(O_NEG, $2); 7939683Slinton } 794*18214Slinton | 795*18214Slinton '(' exp ')' 796*18214Slinton { 797*18214Slinton $$ = $2; 798*18214Slinton } 7999683Slinton ; 800*18214Slinton term: 801*18214Slinton symbol 802*18214Slinton { 803*18214Slinton $$ = $1; 804*18214Slinton } 805*18214Slinton | 806*18214Slinton term '.' name 807*18214Slinton { 808*18214Slinton $$ = unrval(dot($1, $3)); 809*18214Slinton } 810*18214Slinton | 811*18214Slinton term ARROW name 812*18214Slinton { 813*18214Slinton $$ = unrval(dot($1, $3)); 814*18214Slinton } 815*18214Slinton | 816*18214Slinton term '[' exp_list ']' 817*18214Slinton { 818*18214Slinton $$ = unrval(subscript($1, $3)); 819*18214Slinton } 820*18214Slinton ; 8219683Slinton count: 8229683Slinton /* empty */ 8239683Slinton { 8249683Slinton $$ = 1; 8259683Slinton } 8269683Slinton | 8279683Slinton INT 8289683Slinton { 8299683Slinton $$ = $1; 8309683Slinton } 8319683Slinton ; 8329683Slinton mode: 8339683Slinton name 8349683Slinton { 8359683Slinton $$ = ident($1); 8369683Slinton curformat = $$; 8379683Slinton } 8389683Slinton | 8399683Slinton /* empty */ 8409683Slinton { 8419683Slinton $$ = curformat; 8429683Slinton } 8439683Slinton ; 8449683Slinton opt_cond: 8459683Slinton /* empty */ 8469683Slinton { 8479683Slinton $$ = nil; 8489683Slinton } 8499683Slinton | 8509683Slinton IF boolean_exp 8519683Slinton { 8529683Slinton $$ = $2; 8539683Slinton } 8549683Slinton ; 8559683Slinton exp_list: 8569683Slinton exp 8579683Slinton { 8589683Slinton $$ = build(O_COMMA, $1, nil); 8599683Slinton } 8609683Slinton | 8619683Slinton exp ',' exp_list 8629683Slinton { 8639683Slinton $$ = build(O_COMMA, $1, $3); 8649683Slinton } 8659683Slinton ; 8669683Slinton exp: 867*18214Slinton symbol 8689683Slinton { 8699683Slinton $$ = build(O_RVAL, $1); 8709683Slinton } 8719683Slinton | 872*18214Slinton exp '[' exp_list ']' 8739683Slinton { 874*18214Slinton $$ = subscript(unrval($1), $3); 8759683Slinton } 8769683Slinton | 877*18214Slinton exp '.' name 878*18214Slinton { 879*18214Slinton $$ = dot($1, $3); 880*18214Slinton } 881*18214Slinton | 882*18214Slinton exp ARROW name 883*18214Slinton { 884*18214Slinton $$ = dot($1, $3); 885*18214Slinton } 886*18214Slinton | 887*18214Slinton '*' exp %prec UNARYSIGN 888*18214Slinton { 889*18214Slinton $$ = build(O_INDIR, $2); 890*18214Slinton } 891*18214Slinton | 892*18214Slinton exp '^' %prec UNARYSIGN 893*18214Slinton { 894*18214Slinton $$ = build(O_INDIR, $1); 895*18214Slinton } 896*18214Slinton | 89716607Ssam exp '\\' opt_qual_symbol 89811173Slinton { 89911173Slinton $$ = build(O_TYPERENAME, $1, $3); 90011173Slinton } 90111173Slinton | 902*18214Slinton exp '\\' '&' opt_qual_symbol %prec '\\' 903*18214Slinton { 904*18214Slinton $$ = renameptr($1, $4); 905*18214Slinton } 906*18214Slinton | 907*18214Slinton exp '(' opt_exp_list ')' 908*18214Slinton { 909*18214Slinton $$ = build(O_CALL, unrval($1), $3); 910*18214Slinton } 911*18214Slinton | 912*18214Slinton constant 913*18214Slinton { 914*18214Slinton $$ = $1; 915*18214Slinton } 916*18214Slinton | 9179683Slinton '+' exp %prec UNARYSIGN 9189683Slinton { 9199683Slinton $$ = $2; 9209683Slinton } 9219683Slinton | 9229683Slinton '-' exp %prec UNARYSIGN 9239683Slinton { 9249683Slinton $$ = build(O_NEG, $2); 9259683Slinton } 9269683Slinton | 9279683Slinton '&' exp %prec UNARYSIGN 9289683Slinton { 9299683Slinton $$ = amper($2); 9309683Slinton } 9319683Slinton | 9329683Slinton exp '+' exp 9339683Slinton { 9349683Slinton $$ = build(O_ADD, $1, $3); 9359683Slinton } 9369683Slinton | 9379683Slinton exp '-' exp 9389683Slinton { 9399683Slinton $$ = build(O_SUB, $1, $3); 9409683Slinton } 9419683Slinton | 9429683Slinton exp '*' exp 9439683Slinton { 9449683Slinton $$ = build(O_MUL, $1, $3); 9459683Slinton } 9469683Slinton | 9479683Slinton exp '/' exp 9489683Slinton { 9499683Slinton $$ = build(O_DIVF, $1, $3); 9509683Slinton } 9519683Slinton | 9529683Slinton exp DIV exp 9539683Slinton { 9549683Slinton $$ = build(O_DIV, $1, $3); 9559683Slinton } 9569683Slinton | 9579683Slinton exp MOD exp 9589683Slinton { 9599683Slinton $$ = build(O_MOD, $1, $3); 9609683Slinton } 9619683Slinton | 9629683Slinton exp AND exp 9639683Slinton { 9649683Slinton $$ = build(O_AND, $1, $3); 9659683Slinton } 9669683Slinton | 9679683Slinton exp OR exp 9689683Slinton { 9699683Slinton $$ = build(O_OR, $1, $3); 9709683Slinton } 9719683Slinton | 9729683Slinton exp '<' exp 9739683Slinton { 9749683Slinton $$ = build(O_LT, $1, $3); 9759683Slinton } 9769683Slinton | 9779683Slinton exp '<' '=' exp 9789683Slinton { 9799683Slinton $$ = build(O_LE, $1, $4); 9809683Slinton } 9819683Slinton | 9829683Slinton exp '>' exp 9839683Slinton { 9849683Slinton $$ = build(O_GT, $1, $3); 9859683Slinton } 9869683Slinton | 9879683Slinton exp '>' '=' exp 9889683Slinton { 9899683Slinton $$ = build(O_GE, $1, $4); 9909683Slinton } 9919683Slinton | 9929683Slinton exp '=' exp 9939683Slinton { 9949683Slinton $$ = build(O_EQ, $1, $3); 9959683Slinton } 9969683Slinton | 9979683Slinton exp '=' '=' exp 9989683Slinton { 9999683Slinton $$ = build(O_EQ, $1, $4); 10009683Slinton } 10019683Slinton | 10029683Slinton exp '<' '>' exp 10039683Slinton { 10049683Slinton $$ = build(O_NE, $1, $4); 10059683Slinton } 10069683Slinton | 10079683Slinton exp '!' '=' exp 10089683Slinton { 10099683Slinton $$ = build(O_NE, $1, $4); 10109683Slinton } 10119683Slinton | 10129683Slinton '(' exp ')' 10139683Slinton { 10149683Slinton $$ = $2; 10159683Slinton } 10169683Slinton ; 10179683Slinton boolean_exp: 10189683Slinton exp 10199683Slinton { 10209683Slinton chkboolean($1); 10219683Slinton $$ = $1; 10229683Slinton } 10239683Slinton ; 10249683Slinton constant: 10259683Slinton INT 10269683Slinton { 10279683Slinton $$ = build(O_LCON, $1); 10289683Slinton } 10299683Slinton | 1030*18214Slinton CHAR 1031*18214Slinton { 1032*18214Slinton $$ = build(O_CCON, $1); 1033*18214Slinton } 1034*18214Slinton | 10359683Slinton REAL 10369683Slinton { 10379683Slinton $$ = build(O_FCON, $1); 10389683Slinton } 10399683Slinton | 10409683Slinton STRING 10419683Slinton { 10429683Slinton $$ = build(O_SCON, $1); 10439683Slinton } 10449683Slinton ; 104516607Ssam opt_qual_symbol: 104616607Ssam symbol 104716607Ssam { 104816607Ssam $$ = $1; 104916607Ssam } 105016607Ssam | 105116607Ssam opt_qual_symbol '.' name 105216607Ssam { 105316607Ssam $$ = dot($1, $3); 105416607Ssam } 105516607Ssam ; 10569683Slinton symbol: 10579683Slinton name 10589683Slinton { 1059*18214Slinton $$ = findvar($1); 1060*18214Slinton if ($$ == nil) { 1061*18214Slinton $$ = build(O_SYM, which($1)); 1062*18214Slinton } 10639683Slinton } 106416607Ssam | 106516607Ssam '.' name 106616607Ssam { 106716607Ssam $$ = dot(build(O_SYM, program), $2); 106816607Ssam } 10699683Slinton ; 10709683Slinton name: 10719683Slinton NAME 10729683Slinton { 10739683Slinton $$ = $1; 10749683Slinton } 10759683Slinton | 10769683Slinton keyword 10779683Slinton { 10789683Slinton $$ = $1; 10799683Slinton } 10809683Slinton keyword: 108112536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 108216607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 108316607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 1084*18214Slinton RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 1085*18214Slinton STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE | 1086*18214Slinton WHATIS | WHEN | WHERE | WHEREIS | WHICH 10879683Slinton ; 1088