1*21631Sdist /* 2*21631Sdist * Copyright (c) 1980 Regents of the University of California. 3*21631Sdist * All rights reserved. The Berkeley software License Agreement 4*21631Sdist * specifies the terms and conditions for redistribution. 5*21631Sdist * 6*21631Sdist * @(#)commands.y 5.1 (Berkeley) 05/31/85 7*21631Sdist */ 8*21631Sdist 99683Slinton %{ 1018214Slinton 119683Slinton /* Copyright (c) 1982 Regents of the University of California */ 129683Slinton 13*21631Sdist static char sccsid[] = "@(#)commands.y 5.1 (Berkeley) 05/31/85"; 149683Slinton 1518214Slinton static char rcsid[] = "$Header: commands.y,v 1.5 84/12/26 10:38:41 linton Exp $"; 1618214Slinton 179683Slinton /* 189683Slinton * Yacc grammar for debugger commands. 199683Slinton */ 209683Slinton 219683Slinton #include "defs.h" 229683Slinton #include "symbols.h" 239683Slinton #include "operators.h" 249683Slinton #include "tree.h" 259683Slinton #include "process.h" 269683Slinton #include "source.h" 279683Slinton #include "scanner.h" 2818214Slinton #include "keywords.h" 299683Slinton #include "names.h" 3014673Slinton #include "lists.h" 319683Slinton 329683Slinton private String curformat = "X"; 339683Slinton 349683Slinton %} 359683Slinton 369683Slinton %term 3716607Ssam ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP 389683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 3918214Slinton PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS STEP STEPI 4018214Slinton STOP STOPI TRACE TRACEI UNALIAS UNSET UP USE 4118214Slinton WHATIS WHEN WHERE WHEREIS WHICH 429683Slinton 4318214Slinton %term INT CHAR REAL NAME STRING 4418214Slinton %term ARROW 459683Slinton 469683Slinton %right INT 479683Slinton %binary REDIRECT 489683Slinton %binary '<' '=' '>' '!' IN 499683Slinton %left '+' '-' OR 509683Slinton %left UNARYSIGN 519683Slinton %left '*' '/' DIV MOD AND 5218214Slinton %left '\\' 539683Slinton %left NOT '(' '[' '.' '^' ARROW 549683Slinton 559683Slinton %union { 569683Slinton Name y_name; 579683Slinton Symbol y_sym; 589683Slinton Node y_node; 599683Slinton Integer y_int; 609683Slinton Operator y_op; 619683Slinton long y_long; 6218214Slinton char y_char; 639683Slinton double y_real; 649683Slinton String y_string; 659683Slinton Boolean y_bool; 669683Slinton Cmdlist y_cmdlist; 6714673Slinton List y_list; 689683Slinton }; 699683Slinton 709683Slinton %type <y_op> trace stop 7118214Slinton %type <y_long> INT count signal 7218214Slinton %type <y_char> CHAR 739683Slinton %type <y_real> REAL 749683Slinton %type <y_string> STRING redirectout filename opt_filename mode 7516607Ssam %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT 7616607Ssam %type <y_name> DEBUG DELETE DIV DOWN DUMP 779683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 789683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 7918214Slinton %type <y_name> PRINT PSYM QUIT RERUN RETURN RUN SET SH SKIP SOURCE STATUS 8016607Ssam %type <y_name> STEP STEPI STOP STOPI TRACE TRACEI 8118214Slinton %type <y_name> UNALIAS UNSET UP USE WHATIS WHEN WHERE WHEREIS WHICH 829683Slinton %type <y_name> name NAME keyword 8316607Ssam %type <y_node> opt_qual_symbol symbol 849683Slinton %type <y_node> command rcommand cmd step what where examine 8512482Slinton %type <y_node> event opt_exp_list opt_cond 869683Slinton %type <y_node> exp_list exp term boolean_exp constant address 8716934Ssam %type <y_node> integer_list alias_command list_command line_number 889683Slinton %type <y_cmdlist> actions 8918214Slinton %type <y_list> sourcepath name_list 909683Slinton 919683Slinton %% 929683Slinton 939683Slinton input: 949683Slinton input command_nl 959683Slinton | 969683Slinton /* empty */ 979683Slinton ; 989683Slinton command_nl: 999683Slinton command_line '\n' 10018214Slinton | 10118214Slinton command_line ';' 10216926Ssam { 10318214Slinton chkalias = true; 10416926Ssam } 1059683Slinton | 1069683Slinton '\n' 1079683Slinton ; 1089683Slinton 1099683Slinton command_line: 1109683Slinton command 1119683Slinton { 1129683Slinton if ($1 != nil) { 11318214Slinton topeval($1); 1149683Slinton } 1159683Slinton } 1169683Slinton | 1179683Slinton rcommand redirectout 1189683Slinton { 1199683Slinton if ($1 != nil) { 1209683Slinton if ($2 != nil) { 1219683Slinton setout($2); 12218214Slinton topeval($1); 1239683Slinton unsetout(); 1249683Slinton } else { 12518214Slinton topeval($1); 1269683Slinton } 1279683Slinton } 1289683Slinton } 1299683Slinton ; 1309683Slinton redirectout: 1319683Slinton '>' shellmode NAME 1329683Slinton { 1339683Slinton $$ = ident($3); 1349683Slinton } 1359683Slinton | 1369683Slinton /* empty */ 1379683Slinton { 1389683Slinton $$ = nil; 1399683Slinton } 1409683Slinton ; 1419683Slinton 1429683Slinton /* 1439683Slinton * Non-redirectable commands. 1449683Slinton */ 1459683Slinton command: 1469683Slinton alias_command 1479683Slinton { 1489683Slinton $$ = $1; 1499683Slinton } 1509683Slinton | 15118214Slinton ASSIGN exp '=' exp 1529683Slinton { 15318214Slinton $$ = build(O_ASSIGN, unrval($2), $4); 1549683Slinton } 1559683Slinton | 15618214Slinton CATCH signal 1579683Slinton { 15818214Slinton $$ = build(O_CATCH, $2); 1599683Slinton } 1609683Slinton | 16118214Slinton CATCH 16216926Ssam { 16318214Slinton $$ = build(O_CATCH, 0); 16416926Ssam } 16516926Ssam | 1669683Slinton CONT 1679683Slinton { 16814673Slinton $$ = build(O_CONT, (long) DEFSIG); 1699683Slinton } 1709683Slinton | 17118214Slinton CONT signal 17211870Slinton { 17311870Slinton $$ = build(O_CONT, $2); 17411870Slinton } 17511870Slinton | 17616934Ssam DELETE integer_list 1779683Slinton { 1789683Slinton $$ = build(O_DELETE, $2); 1799683Slinton } 1809683Slinton | 18116607Ssam DOWN 18216607Ssam { 18316607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 18416607Ssam } 18516607Ssam | 18616607Ssam DOWN INT 18716607Ssam { 18816607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 18916607Ssam } 19016607Ssam | 1919683Slinton EDIT shellmode opt_filename 1929683Slinton { 1939683Slinton $$ = build(O_EDIT, $3); 1949683Slinton } 1959683Slinton | 1969683Slinton FILE shellmode opt_filename 1979683Slinton { 1989683Slinton $$ = build(O_CHFILE, $3); 1999683Slinton } 2009683Slinton | 2019683Slinton FUNC 2029683Slinton { 2039683Slinton $$ = build(O_FUNC, nil); 2049683Slinton } 2059683Slinton | 20618214Slinton FUNC opt_qual_symbol 2079683Slinton { 20818214Slinton $$ = build(O_FUNC, $2); 2099683Slinton } 2109683Slinton | 2119683Slinton GRIPE 2129683Slinton { 2139683Slinton $$ = build(O_GRIPE); 2149683Slinton } 2159683Slinton | 2169683Slinton HELP 2179683Slinton { 2189683Slinton $$ = build(O_HELP); 2199683Slinton } 2209683Slinton | 22118214Slinton IGNORE signal 2229683Slinton { 22318214Slinton $$ = build(O_IGNORE, $2); 2249683Slinton } 2259683Slinton | 22618214Slinton IGNORE 22716926Ssam { 22818214Slinton $$ = build(O_IGNORE, 0); 22916926Ssam } 23016926Ssam | 2319683Slinton list_command 2329683Slinton { 2339683Slinton $$ = $1; 2349683Slinton } 2359683Slinton | 23618214Slinton PSYM exp 2379683Slinton { 23818214Slinton $$ = build(O_PSYM, unrval($2)); 2399683Slinton } 2409683Slinton | 2419683Slinton QUIT 2429683Slinton { 2439683Slinton if (not popinput()) { 2449683Slinton quit(0); 2459683Slinton } else { 2469683Slinton $$ = nil; 2479683Slinton } 2489683Slinton } 2499683Slinton | 25016607Ssam RETURN 25116607Ssam { 25216607Ssam $$ = build(O_RETURN, nil); 25316607Ssam } 25416607Ssam | 25518214Slinton RETURN opt_qual_symbol 25616607Ssam { 25718214Slinton $$ = build(O_RETURN, $2); 25816607Ssam } 25916607Ssam | 2609683Slinton runcommand 2619683Slinton { 2629683Slinton run(); 2639683Slinton /* NOTREACHED */ 2649683Slinton } 2659683Slinton | 26618214Slinton SET name '=' exp 26718214Slinton { 26818214Slinton $$ = build(O_SET, build(O_NAME, $2), $4); 26918214Slinton } 27018214Slinton | 27118214Slinton SET name 27218214Slinton { 27318214Slinton $$ = build(O_SET, build(O_NAME, $2), nil); 27418214Slinton } 27518214Slinton | 27618214Slinton SET 27718214Slinton { 27818214Slinton $$ = build(O_SET, nil, nil); 27918214Slinton } 28018214Slinton | 2819683Slinton SH 2829683Slinton { 2839683Slinton shellline(); 2849683Slinton $$ = nil; 2859683Slinton } 2869683Slinton | 2879683Slinton SOURCE shellmode filename 2889683Slinton { 2899683Slinton $$ = build(O_SOURCE, $3); 2909683Slinton } 2919683Slinton | 2929683Slinton step 2939683Slinton { 2949683Slinton $$ = $1; 2959683Slinton } 2969683Slinton | 2979683Slinton stop where opt_cond 2989683Slinton { 2999683Slinton $$ = build($1, nil, $2, $3); 3009683Slinton } 3019683Slinton | 3029683Slinton stop what opt_cond 3039683Slinton { 3049683Slinton $$ = build($1, $2, nil, $3); 3059683Slinton } 3069683Slinton | 3079683Slinton stop IF boolean_exp 3089683Slinton { 3099683Slinton $$ = build($1, nil, nil, $3); 3109683Slinton } 3119683Slinton | 3129683Slinton trace what where opt_cond 3139683Slinton { 3149683Slinton $$ = build($1, $2, $3, $4); 3159683Slinton } 3169683Slinton | 3179683Slinton trace where opt_cond 3189683Slinton { 3199683Slinton $$ = build($1, nil, $2, $3); 3209683Slinton } 3219683Slinton | 3229683Slinton trace what opt_cond 3239683Slinton { 3249683Slinton $$ = build($1, $2, nil, $3); 3259683Slinton } 3269683Slinton | 3279683Slinton trace opt_cond 3289683Slinton { 3299683Slinton $$ = build($1, nil, nil, $2); 3309683Slinton } 3319683Slinton | 33218214Slinton UNALIAS name 33318214Slinton { 33418214Slinton $$ = build(O_UNALIAS, build(O_NAME, $2)); 33518214Slinton } 33618214Slinton | 33718214Slinton UNSET name 33818214Slinton { 33918214Slinton $$ = build(O_UNSET, build(O_NAME, $2)); 34018214Slinton } 34118214Slinton | 34216607Ssam UP 3439683Slinton { 34416607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 3459683Slinton } 3469683Slinton | 34716607Ssam UP INT 3489683Slinton { 34916607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3509683Slinton } 3519683Slinton | 3529683Slinton USE shellmode sourcepath 3539683Slinton { 35414673Slinton String dir; 35514673Slinton 3569683Slinton $$ = nil; 35714673Slinton if (list_size($3) == 0) { 35814673Slinton foreach (String, dir, sourcepath) 35914673Slinton printf("%s ", dir); 36014673Slinton endfor 36114673Slinton printf("\n"); 36214673Slinton } else { 36314673Slinton foreach (String, dir, sourcepath) 36414673Slinton list_delete(list_curitem(sourcepath), sourcepath); 36514673Slinton endfor 36614673Slinton sourcepath = $3; 3679683Slinton } 3689683Slinton } 36916604Ssam | 37018214Slinton WHATIS opt_qual_symbol 37116604Ssam { 37218214Slinton $$ = build(O_WHATIS, $2); 37316604Ssam } 37416607Ssam | 37518214Slinton WHEN event '{' actions '}' 37616604Ssam { 37718214Slinton $$ = build(O_ADDEVENT, $2, $4); 37816604Ssam } 37916604Ssam | 38018214Slinton WHEREIS name 38116604Ssam { 38218214Slinton $$ = build(O_WHEREIS, build(O_SYM, lookup($2))); 38316604Ssam } 38416607Ssam | 38518214Slinton WHICH symbol 38616604Ssam { 38718214Slinton $$ = build(O_WHICH, $2); 38816604Ssam } 38916625Ssam | 39018214Slinton '/' 39116625Ssam { 39218214Slinton $$ = build(O_SEARCH, 39318214Slinton build(O_LCON, (long) '/'), 39418214Slinton build(O_SCON, strdup(scanner_linebuf)) 39518214Slinton ); 39618214Slinton gobble(); 39718214Slinton insertinput("\n"); 39816625Ssam } 39916625Ssam | 40018214Slinton '?' 40116625Ssam { 40218214Slinton $$ = build(O_SEARCH, 40318214Slinton build(O_LCON, (long) '?'), 40418214Slinton build(O_SCON, strdup(scanner_linebuf)) 40518214Slinton ); 40618214Slinton gobble(); 40718214Slinton insertinput("\n"); 40816625Ssam } 40916625Ssam ; 41016926Ssam signal: 41116926Ssam INT 41216926Ssam { 41318214Slinton $$ = $1; 41416926Ssam } 41516926Ssam | 41618214Slinton name 41716926Ssam { 41818214Slinton $$ = siglookup(ident($1)); 41916926Ssam } 42016926Ssam ; 4219683Slinton runcommand: 42216607Ssam run arglist 42312482Slinton | 42412524Slinton run 4259683Slinton ; 4269683Slinton run: 42712524Slinton RUN shellmode 4289683Slinton { 42916607Ssam arginit(); 4309683Slinton fflush(stdout); 4319683Slinton } 43216607Ssam | 43316607Ssam RERUN shellmode 43416607Ssam { 43516607Ssam fflush(stdout); 43616607Ssam } 4379683Slinton ; 4389683Slinton arglist: 4399683Slinton arglist arg 4409683Slinton | 44112482Slinton arg 4429683Slinton ; 4439683Slinton arg: 44418214Slinton NAME 4459683Slinton { 4469683Slinton newarg(ident($1)); 4479683Slinton } 4489683Slinton | 44918214Slinton STRING 45016607Ssam { 45116607Ssam newarg($1); 45216607Ssam } 45316607Ssam | 4549683Slinton '<' NAME 4559683Slinton { 4569683Slinton inarg(ident($2)); 4579683Slinton } 4589683Slinton | 4599683Slinton '>' NAME 4609683Slinton { 4619683Slinton outarg(ident($2)); 4629683Slinton } 4639683Slinton ; 4649683Slinton step: 46518214Slinton STEP 4669683Slinton { 4679683Slinton $$ = build(O_STEP, true, false); 4689683Slinton } 4699683Slinton | 47018214Slinton STEPI 4719683Slinton { 4729683Slinton $$ = build(O_STEP, false, false); 4739683Slinton } 4749683Slinton | 47518214Slinton NEXT 4769683Slinton { 4779683Slinton $$ = build(O_STEP, true, true); 4789683Slinton } 4799683Slinton | 48018214Slinton NEXTI 4819683Slinton { 4829683Slinton $$ = build(O_STEP, false, true); 4839683Slinton } 4849683Slinton ; 4859683Slinton shellmode: 4869683Slinton /* empty */ 4879683Slinton { 4889683Slinton beginshellmode(); 4899683Slinton } 4909683Slinton ; 4919683Slinton sourcepath: 4929683Slinton sourcepath NAME 4939683Slinton { 49414673Slinton $$ = $1; 49514673Slinton list_append(list_item(ident($2)), nil, $$); 4969683Slinton } 4979683Slinton | 4989683Slinton /* empty */ 4999683Slinton { 50014673Slinton $$ = list_alloc(); 5019683Slinton } 5029683Slinton ; 5039683Slinton event: 5049683Slinton where 5059683Slinton | 5069683Slinton exp 5079683Slinton ; 5089683Slinton actions: 5099683Slinton actions cmd ';' 5109683Slinton { 5119683Slinton $$ = $1; 5129683Slinton cmdlist_append($2, $$); 5139683Slinton } 5149683Slinton | 5159683Slinton cmd ';' 5169683Slinton { 5179683Slinton $$ = list_alloc(); 5189683Slinton cmdlist_append($1, $$); 5199683Slinton } 5209683Slinton ; 5219683Slinton cmd: 5229683Slinton command 5239683Slinton | 5249683Slinton rcommand 5259683Slinton ; 5269683Slinton 5279683Slinton /* 5289683Slinton * Redirectable commands. 5299683Slinton */ 5309683Slinton rcommand: 53118214Slinton PRINT exp_list 5329683Slinton { 53318214Slinton $$ = build(O_PRINT, $2); 5349683Slinton } 5359683Slinton | 5369683Slinton WHERE 5379683Slinton { 5389683Slinton $$ = build(O_WHERE); 5399683Slinton } 5409683Slinton | 5419683Slinton examine 5429683Slinton { 5439683Slinton $$ = $1; 5449683Slinton } 5459683Slinton | 54618214Slinton CALL term '(' opt_exp_list ')' 5479683Slinton { 54818214Slinton $$ = build(O_CALLPROC, $2, $4); 5499683Slinton } 5509683Slinton | 55112536Scsvaf DEBUG INT 55212536Scsvaf { 55312536Scsvaf $$ = build(O_DEBUG, $2); 55412536Scsvaf } 55512536Scsvaf | 55618214Slinton DEBUG '-' INT 55718214Slinton { 55818214Slinton $$ = build(O_DEBUG, -$3); 55918214Slinton } 56018214Slinton | 56118214Slinton DUMP opt_qual_symbol 56218214Slinton { 56318214Slinton $$ = build(O_DUMP, $2); 56418214Slinton } 56518214Slinton | 56618214Slinton DUMP '.' 56718214Slinton { 56818214Slinton $$ = build(O_DUMP, nil); 56918214Slinton } 57018214Slinton | 5719683Slinton DUMP 5729683Slinton { 57318214Slinton $$ = build(O_DUMP, build(O_SYM, curfunc)); 5749683Slinton } 5759683Slinton | 5769683Slinton STATUS 5779683Slinton { 5789683Slinton $$ = build(O_STATUS); 5799683Slinton } 5809683Slinton ; 5819683Slinton alias_command: 58218214Slinton ALIAS name name 5839683Slinton { 58418214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 5859683Slinton } 5869683Slinton | 58718214Slinton ALIAS name STRING 5889683Slinton { 58918214Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_SCON, $3)); 59018214Slinton } 59118214Slinton | 59218214Slinton ALIAS name '(' name_list ')' STRING 59318214Slinton { 59418214Slinton $$ = build(O_ALIAS, 59518214Slinton build(O_COMMA, build(O_NAME, $2), (Node) $4), 59618214Slinton build(O_SCON, $6) 59718214Slinton ); 59818214Slinton } 59918214Slinton | 60018214Slinton ALIAS name 60118214Slinton { 6029683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 6039683Slinton } 6049683Slinton | 60518214Slinton ALIAS 6069683Slinton { 6079683Slinton $$ = build(O_ALIAS, nil, nil); 6089683Slinton } 6099683Slinton ; 61018214Slinton name_list: 61118214Slinton name_list ',' name 61216926Ssam { 61318214Slinton $$ = $1; 61418214Slinton list_append(list_item($3), nil, $$); 61516926Ssam } 61618214Slinton | 61718214Slinton name 61818214Slinton { 61918214Slinton $$ = list_alloc(); 62018214Slinton list_append(list_item($1), nil, $$); 62118214Slinton } 62216926Ssam ; 6239683Slinton trace: 62418214Slinton TRACE 6259683Slinton { 6269683Slinton $$ = O_TRACE; 6279683Slinton } 6289683Slinton | 62918214Slinton TRACEI 6309683Slinton { 6319683Slinton $$ = O_TRACEI; 6329683Slinton } 6339683Slinton ; 6349683Slinton stop: 63518214Slinton STOP 6369683Slinton { 6379683Slinton $$ = O_STOP; 6389683Slinton } 6399683Slinton | 64018214Slinton STOPI 6419683Slinton { 6429683Slinton $$ = O_STOPI; 6439683Slinton } 6449683Slinton ; 6459683Slinton what: 6469683Slinton exp 6479683Slinton { 6489683Slinton $$ = $1; 6499683Slinton } 6509683Slinton | 6519683Slinton STRING ':' line_number 6529683Slinton { 6539683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 6549683Slinton } 6559683Slinton ; 6569683Slinton where: 65718214Slinton IN exp 6589683Slinton { 65918214Slinton $$ = unrval($2); 6609683Slinton } 6619683Slinton | 6629683Slinton AT line_number 6639683Slinton { 66418214Slinton $$ = build(O_QLINE, build(O_SCON, strdup(cursource)), $2); 6659683Slinton } 6669683Slinton | 6679683Slinton AT STRING ':' line_number 6689683Slinton { 6699683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 6709683Slinton } 6719683Slinton ; 6729683Slinton filename: 6739683Slinton NAME 6749683Slinton { 6759683Slinton $$ = ident($1); 6769683Slinton } 6779683Slinton ; 6789683Slinton opt_filename: 6799683Slinton /* empty */ 6809683Slinton { 6819683Slinton $$ = nil; 6829683Slinton } 6839683Slinton | 6849683Slinton filename 6859683Slinton { 6869683Slinton $$ = $1; 6879683Slinton } 6889683Slinton ; 68912482Slinton opt_exp_list: 69012482Slinton exp_list 6919683Slinton { 69212482Slinton $$ = $1; 6939683Slinton } 6949683Slinton | 69512482Slinton /* empty */ 6969683Slinton { 69712482Slinton $$ = nil; 6989683Slinton } 6999683Slinton ; 7009683Slinton list_command: 70118214Slinton LIST 7029683Slinton { 7039683Slinton $$ = build(O_LIST, 7049683Slinton build(O_LCON, (long) cursrcline), 7059683Slinton build(O_LCON, (long) cursrcline + 9) 7069683Slinton ); 7079683Slinton } 7089683Slinton | 70918214Slinton LIST line_number 7109683Slinton { 7119683Slinton $$ = build(O_LIST, $2, $2); 7129683Slinton } 7139683Slinton | 71418214Slinton LIST line_number ',' line_number 7159683Slinton { 7169683Slinton $$ = build(O_LIST, $2, $4); 7179683Slinton } 7189683Slinton | 71918214Slinton LIST opt_qual_symbol 7209683Slinton { 72118214Slinton $$ = build(O_LIST, $2); 7229683Slinton } 7239683Slinton ; 72418214Slinton integer_list: 72518214Slinton INT 72618214Slinton { 72718214Slinton $$ = build(O_LCON, $1); 72818214Slinton } 72918214Slinton | 73018214Slinton INT integer_list 73118214Slinton { 73218214Slinton $$ = build(O_COMMA, build(O_LCON, $1), $2); 73318214Slinton } 73416607Ssam ; 7359683Slinton line_number: 7369683Slinton INT 7379683Slinton { 7389683Slinton $$ = build(O_LCON, $1); 7399683Slinton } 7409683Slinton | 7419683Slinton '$' 7429683Slinton { 7439683Slinton $$ = build(O_LCON, (long) LASTLINE); 7449683Slinton } 7459683Slinton ; 7469683Slinton examine: 7479683Slinton address '/' count mode 7489683Slinton { 7499683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 7509683Slinton } 7519683Slinton | 7529683Slinton address ',' address '/' mode 7539683Slinton { 7549683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 7559683Slinton } 7569683Slinton | 75711173Slinton address '=' mode 75811173Slinton { 75911173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 76011173Slinton } 7619683Slinton ; 7629683Slinton address: 76318214Slinton INT 7649683Slinton { 7659683Slinton $$ = build(O_LCON, $1); 7669683Slinton } 7679683Slinton | 76818214Slinton '.' 7699683Slinton { 77018214Slinton $$ = build(O_LCON, (long) prtaddr); 7719683Slinton } 7729683Slinton | 77318214Slinton '&' term 77418214Slinton { 77518214Slinton $$ = amper($2); 77618214Slinton } 77718214Slinton | 7789683Slinton address '+' address 7799683Slinton { 7809683Slinton $$ = build(O_ADD, $1, $3); 7819683Slinton } 7829683Slinton | 7839683Slinton address '-' address 7849683Slinton { 7859683Slinton $$ = build(O_SUB, $1, $3); 7869683Slinton } 7879683Slinton | 7889683Slinton address '*' address 7899683Slinton { 7909683Slinton $$ = build(O_MUL, $1, $3); 7919683Slinton } 7929683Slinton | 79318214Slinton '*' address %prec UNARYSIGN 7949683Slinton { 79518214Slinton $$ = build(O_INDIR, $2); 7969683Slinton } 7979683Slinton | 79818214Slinton '-' address %prec UNARYSIGN 7999683Slinton { 80018214Slinton $$ = build(O_NEG, $2); 8019683Slinton } 80218214Slinton | 80318214Slinton '(' exp ')' 80418214Slinton { 80518214Slinton $$ = $2; 80618214Slinton } 8079683Slinton ; 80818214Slinton term: 80918214Slinton symbol 81018214Slinton { 81118214Slinton $$ = $1; 81218214Slinton } 81318214Slinton | 81418214Slinton term '.' name 81518214Slinton { 81618214Slinton $$ = unrval(dot($1, $3)); 81718214Slinton } 81818214Slinton | 81918214Slinton term ARROW name 82018214Slinton { 82118214Slinton $$ = unrval(dot($1, $3)); 82218214Slinton } 82318214Slinton | 82418214Slinton term '[' exp_list ']' 82518214Slinton { 82618214Slinton $$ = unrval(subscript($1, $3)); 82718214Slinton } 82818214Slinton ; 8299683Slinton count: 8309683Slinton /* empty */ 8319683Slinton { 8329683Slinton $$ = 1; 8339683Slinton } 8349683Slinton | 8359683Slinton INT 8369683Slinton { 8379683Slinton $$ = $1; 8389683Slinton } 8399683Slinton ; 8409683Slinton mode: 8419683Slinton name 8429683Slinton { 8439683Slinton $$ = ident($1); 8449683Slinton curformat = $$; 8459683Slinton } 8469683Slinton | 8479683Slinton /* empty */ 8489683Slinton { 8499683Slinton $$ = curformat; 8509683Slinton } 8519683Slinton ; 8529683Slinton opt_cond: 8539683Slinton /* empty */ 8549683Slinton { 8559683Slinton $$ = nil; 8569683Slinton } 8579683Slinton | 8589683Slinton IF boolean_exp 8599683Slinton { 8609683Slinton $$ = $2; 8619683Slinton } 8629683Slinton ; 8639683Slinton exp_list: 8649683Slinton exp 8659683Slinton { 8669683Slinton $$ = build(O_COMMA, $1, nil); 8679683Slinton } 8689683Slinton | 8699683Slinton exp ',' exp_list 8709683Slinton { 8719683Slinton $$ = build(O_COMMA, $1, $3); 8729683Slinton } 8739683Slinton ; 8749683Slinton exp: 87518214Slinton symbol 8769683Slinton { 8779683Slinton $$ = build(O_RVAL, $1); 8789683Slinton } 8799683Slinton | 88018214Slinton exp '[' exp_list ']' 8819683Slinton { 88218214Slinton $$ = subscript(unrval($1), $3); 8839683Slinton } 8849683Slinton | 88518214Slinton exp '.' name 88618214Slinton { 88718214Slinton $$ = dot($1, $3); 88818214Slinton } 88918214Slinton | 89018214Slinton exp ARROW name 89118214Slinton { 89218214Slinton $$ = dot($1, $3); 89318214Slinton } 89418214Slinton | 89518214Slinton '*' exp %prec UNARYSIGN 89618214Slinton { 89718214Slinton $$ = build(O_INDIR, $2); 89818214Slinton } 89918214Slinton | 90018214Slinton exp '^' %prec UNARYSIGN 90118214Slinton { 90218214Slinton $$ = build(O_INDIR, $1); 90318214Slinton } 90418214Slinton | 90516607Ssam exp '\\' opt_qual_symbol 90611173Slinton { 90711173Slinton $$ = build(O_TYPERENAME, $1, $3); 90811173Slinton } 90911173Slinton | 91018214Slinton exp '\\' '&' opt_qual_symbol %prec '\\' 91118214Slinton { 91218214Slinton $$ = renameptr($1, $4); 91318214Slinton } 91418214Slinton | 91518214Slinton exp '(' opt_exp_list ')' 91618214Slinton { 91718214Slinton $$ = build(O_CALL, unrval($1), $3); 91818214Slinton } 91918214Slinton | 92018214Slinton constant 92118214Slinton { 92218214Slinton $$ = $1; 92318214Slinton } 92418214Slinton | 9259683Slinton '+' exp %prec UNARYSIGN 9269683Slinton { 9279683Slinton $$ = $2; 9289683Slinton } 9299683Slinton | 9309683Slinton '-' exp %prec UNARYSIGN 9319683Slinton { 9329683Slinton $$ = build(O_NEG, $2); 9339683Slinton } 9349683Slinton | 9359683Slinton '&' exp %prec UNARYSIGN 9369683Slinton { 9379683Slinton $$ = amper($2); 9389683Slinton } 9399683Slinton | 9409683Slinton exp '+' exp 9419683Slinton { 9429683Slinton $$ = build(O_ADD, $1, $3); 9439683Slinton } 9449683Slinton | 9459683Slinton exp '-' exp 9469683Slinton { 9479683Slinton $$ = build(O_SUB, $1, $3); 9489683Slinton } 9499683Slinton | 9509683Slinton exp '*' exp 9519683Slinton { 9529683Slinton $$ = build(O_MUL, $1, $3); 9539683Slinton } 9549683Slinton | 9559683Slinton exp '/' exp 9569683Slinton { 9579683Slinton $$ = build(O_DIVF, $1, $3); 9589683Slinton } 9599683Slinton | 9609683Slinton exp DIV exp 9619683Slinton { 9629683Slinton $$ = build(O_DIV, $1, $3); 9639683Slinton } 9649683Slinton | 9659683Slinton exp MOD exp 9669683Slinton { 9679683Slinton $$ = build(O_MOD, $1, $3); 9689683Slinton } 9699683Slinton | 9709683Slinton exp AND exp 9719683Slinton { 9729683Slinton $$ = build(O_AND, $1, $3); 9739683Slinton } 9749683Slinton | 9759683Slinton exp OR exp 9769683Slinton { 9779683Slinton $$ = build(O_OR, $1, $3); 9789683Slinton } 9799683Slinton | 9809683Slinton exp '<' exp 9819683Slinton { 9829683Slinton $$ = build(O_LT, $1, $3); 9839683Slinton } 9849683Slinton | 9859683Slinton exp '<' '=' exp 9869683Slinton { 9879683Slinton $$ = build(O_LE, $1, $4); 9889683Slinton } 9899683Slinton | 9909683Slinton exp '>' exp 9919683Slinton { 9929683Slinton $$ = build(O_GT, $1, $3); 9939683Slinton } 9949683Slinton | 9959683Slinton exp '>' '=' exp 9969683Slinton { 9979683Slinton $$ = build(O_GE, $1, $4); 9989683Slinton } 9999683Slinton | 10009683Slinton exp '=' exp 10019683Slinton { 10029683Slinton $$ = build(O_EQ, $1, $3); 10039683Slinton } 10049683Slinton | 10059683Slinton exp '=' '=' exp 10069683Slinton { 10079683Slinton $$ = build(O_EQ, $1, $4); 10089683Slinton } 10099683Slinton | 10109683Slinton exp '<' '>' exp 10119683Slinton { 10129683Slinton $$ = build(O_NE, $1, $4); 10139683Slinton } 10149683Slinton | 10159683Slinton exp '!' '=' exp 10169683Slinton { 10179683Slinton $$ = build(O_NE, $1, $4); 10189683Slinton } 10199683Slinton | 10209683Slinton '(' exp ')' 10219683Slinton { 10229683Slinton $$ = $2; 10239683Slinton } 10249683Slinton ; 10259683Slinton boolean_exp: 10269683Slinton exp 10279683Slinton { 10289683Slinton chkboolean($1); 10299683Slinton $$ = $1; 10309683Slinton } 10319683Slinton ; 10329683Slinton constant: 10339683Slinton INT 10349683Slinton { 10359683Slinton $$ = build(O_LCON, $1); 10369683Slinton } 10379683Slinton | 103818214Slinton CHAR 103918214Slinton { 104018214Slinton $$ = build(O_CCON, $1); 104118214Slinton } 104218214Slinton | 10439683Slinton REAL 10449683Slinton { 10459683Slinton $$ = build(O_FCON, $1); 10469683Slinton } 10479683Slinton | 10489683Slinton STRING 10499683Slinton { 10509683Slinton $$ = build(O_SCON, $1); 10519683Slinton } 10529683Slinton ; 105316607Ssam opt_qual_symbol: 105416607Ssam symbol 105516607Ssam { 105616607Ssam $$ = $1; 105716607Ssam } 105816607Ssam | 105916607Ssam opt_qual_symbol '.' name 106016607Ssam { 106116607Ssam $$ = dot($1, $3); 106216607Ssam } 106316607Ssam ; 10649683Slinton symbol: 10659683Slinton name 10669683Slinton { 106718214Slinton $$ = findvar($1); 106818214Slinton if ($$ == nil) { 106918214Slinton $$ = build(O_SYM, which($1)); 107018214Slinton } 10719683Slinton } 107216607Ssam | 107316607Ssam '.' name 107416607Ssam { 107516607Ssam $$ = dot(build(O_SYM, program), $2); 107616607Ssam } 10779683Slinton ; 10789683Slinton name: 10799683Slinton NAME 10809683Slinton { 10819683Slinton $$ = $1; 10829683Slinton } 10839683Slinton | 10849683Slinton keyword 10859683Slinton { 10869683Slinton $$ = $1; 10879683Slinton } 10889683Slinton keyword: 108912536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 109016607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 109116607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 109218214Slinton RERUN | RETURN | RUN | SET | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 109318214Slinton STOP | STOPI | TRACE | TRACEI | UNALIAS | UNSET | UP | USE | 109418214Slinton WHATIS | WHEN | WHERE | WHEREIS | WHICH 10959683Slinton ; 1096