19683Slinton %{ 29683Slinton 39683Slinton /* Copyright (c) 1982 Regents of the University of California */ 49683Slinton 5*16604Ssam static char sccsid[] = "@(#)commands.y 1.10 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 2612536Scsvaf ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP 279683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 289683Slinton PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI 299683Slinton STOP STOPI TRACE TRACEI 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 6212536Scsvaf %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DUMP 639683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 649683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 659683Slinton %type <y_name> PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI 669683Slinton %type <y_name> STOP STOPI TRACE TRACEI 679683Slinton %type <y_name> USE WHATIS WHEN WHERE WHEREIS WHICH 689683Slinton %type <y_name> name NAME keyword 699683Slinton %type <y_node> symbol 709683Slinton %type <y_node> command rcommand cmd step what where examine 7112482Slinton %type <y_node> event opt_exp_list opt_cond 729683Slinton %type <y_node> exp_list exp term boolean_exp constant address 739683Slinton %type <y_node> alias_command list_command line_number 74*16604Ssam %type <y_node> search_command pattern 759683Slinton %type <y_cmdlist> actions 7614673Slinton %type <y_list> sourcepath 779683Slinton 789683Slinton %% 799683Slinton 809683Slinton input: 819683Slinton input command_nl 829683Slinton | 839683Slinton /* empty */ 849683Slinton ; 859683Slinton command_nl: 869683Slinton command_line '\n' 879683Slinton | 889683Slinton command_line ';' 899683Slinton | 909683Slinton '\n' 919683Slinton ; 929683Slinton 939683Slinton command_line: 949683Slinton command 959683Slinton { 969683Slinton if ($1 != nil) { 9712536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 989683Slinton eval($1); 999683Slinton } 1009683Slinton } 1019683Slinton | 1029683Slinton rcommand redirectout 1039683Slinton { 1049683Slinton if ($1 != nil) { 1059683Slinton if ($2 != nil) { 1069683Slinton setout($2); 10712536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1089683Slinton eval($1); 1099683Slinton unsetout(); 1109683Slinton } else { 11112536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1129683Slinton eval($1); 1139683Slinton } 1149683Slinton } 1159683Slinton } 1169683Slinton ; 1179683Slinton redirectout: 1189683Slinton '>' shellmode NAME 1199683Slinton { 1209683Slinton $$ = ident($3); 1219683Slinton } 1229683Slinton | 1239683Slinton /* empty */ 1249683Slinton { 1259683Slinton $$ = nil; 1269683Slinton } 1279683Slinton ; 1289683Slinton 1299683Slinton /* 1309683Slinton * Non-redirectable commands. 1319683Slinton */ 1329683Slinton command: 1339683Slinton alias_command 1349683Slinton { 1359683Slinton $$ = $1; 1369683Slinton } 1379683Slinton | 1389683Slinton ASSIGN term '=' exp 1399683Slinton { 1409683Slinton $$ = build(O_ASSIGN, $2, $4); 1419683Slinton } 1429683Slinton | 1439683Slinton CATCH INT 1449683Slinton { 1459683Slinton $$ = build(O_CATCH, $2); 1469683Slinton } 1479683Slinton | 1489683Slinton CONT 1499683Slinton { 15014673Slinton $$ = build(O_CONT, (long) DEFSIG); 1519683Slinton } 1529683Slinton | 15311870Slinton CONT INT 15411870Slinton { 15511870Slinton $$ = build(O_CONT, $2); 15611870Slinton } 15711870Slinton | 1589683Slinton DELETE INT 1599683Slinton { 1609683Slinton $$ = build(O_DELETE, $2); 1619683Slinton } 1629683Slinton | 1639683Slinton EDIT shellmode opt_filename 1649683Slinton { 1659683Slinton $$ = build(O_EDIT, $3); 1669683Slinton } 1679683Slinton | 1689683Slinton FILE shellmode opt_filename 1699683Slinton { 1709683Slinton $$ = build(O_CHFILE, $3); 1719683Slinton } 1729683Slinton | 1739683Slinton FUNC 1749683Slinton { 1759683Slinton $$ = build(O_FUNC, nil); 1769683Slinton } 1779683Slinton | 1789683Slinton FUNC symbol 1799683Slinton { 1809683Slinton $$ = build(O_FUNC, $2); 1819683Slinton } 1829683Slinton | 1839683Slinton GRIPE 1849683Slinton { 1859683Slinton $$ = build(O_GRIPE); 1869683Slinton } 1879683Slinton | 1889683Slinton HELP 1899683Slinton { 1909683Slinton $$ = build(O_HELP); 1919683Slinton } 1929683Slinton | 1939683Slinton IGNORE INT 1949683Slinton { 1959683Slinton $$ = build(O_IGNORE, $2); 1969683Slinton } 1979683Slinton | 1989683Slinton list_command 1999683Slinton { 2009683Slinton $$ = $1; 2019683Slinton } 2029683Slinton | 2039683Slinton PSYM term 2049683Slinton { 2059683Slinton $$ = build(O_PSYM, $2); 2069683Slinton } 2079683Slinton | 2089683Slinton QUIT 2099683Slinton { 2109683Slinton if (not popinput()) { 2119683Slinton quit(0); 2129683Slinton } else { 2139683Slinton $$ = nil; 2149683Slinton } 2159683Slinton } 2169683Slinton | 2179683Slinton runcommand 2189683Slinton { 2199683Slinton run(); 2209683Slinton /* NOTREACHED */ 2219683Slinton } 2229683Slinton | 2239683Slinton SH 2249683Slinton { 2259683Slinton shellline(); 2269683Slinton $$ = nil; 2279683Slinton } 2289683Slinton | 2299683Slinton SOURCE shellmode filename 2309683Slinton { 2319683Slinton $$ = build(O_SOURCE, $3); 2329683Slinton } 2339683Slinton | 2349683Slinton step 2359683Slinton { 2369683Slinton $$ = $1; 2379683Slinton } 2389683Slinton | 2399683Slinton stop where opt_cond 2409683Slinton { 2419683Slinton $$ = build($1, nil, $2, $3); 2429683Slinton } 2439683Slinton | 2449683Slinton stop what opt_cond 2459683Slinton { 2469683Slinton $$ = build($1, $2, nil, $3); 2479683Slinton } 2489683Slinton | 2499683Slinton stop IF boolean_exp 2509683Slinton { 2519683Slinton $$ = build($1, nil, nil, $3); 2529683Slinton } 2539683Slinton | 2549683Slinton trace what where opt_cond 2559683Slinton { 2569683Slinton $$ = build($1, $2, $3, $4); 2579683Slinton } 2589683Slinton | 2599683Slinton trace where opt_cond 2609683Slinton { 2619683Slinton $$ = build($1, nil, $2, $3); 2629683Slinton } 2639683Slinton | 2649683Slinton trace what opt_cond 2659683Slinton { 2669683Slinton $$ = build($1, $2, nil, $3); 2679683Slinton } 2689683Slinton | 2699683Slinton trace opt_cond 2709683Slinton { 2719683Slinton $$ = build($1, nil, nil, $2); 2729683Slinton } 2739683Slinton | 2749683Slinton WHATIS term 2759683Slinton { 2769683Slinton $$ = build(O_WHATIS, $2); 2779683Slinton } 2789683Slinton | 2799683Slinton WHEN event '{' actions '}' 2809683Slinton { 2819683Slinton $$ = build(O_ADDEVENT, $2, $4); 2829683Slinton } 2839683Slinton | 2849683Slinton WHEREIS symbol 2859683Slinton { 2869683Slinton $$ = build(O_WHEREIS, $2); 2879683Slinton } 2889683Slinton | 2899683Slinton WHICH symbol 2909683Slinton { 2919683Slinton $$ = build(O_WHICH, $2); 2929683Slinton } 2939683Slinton | 2949683Slinton USE shellmode sourcepath 2959683Slinton { 29614673Slinton String dir; 29714673Slinton 2989683Slinton $$ = nil; 29914673Slinton if (list_size($3) == 0) { 30014673Slinton foreach (String, dir, sourcepath) 30114673Slinton printf("%s ", dir); 30214673Slinton endfor 30314673Slinton printf("\n"); 30414673Slinton } else { 30514673Slinton foreach (String, dir, sourcepath) 30614673Slinton list_delete(list_curitem(sourcepath), sourcepath); 30714673Slinton endfor 30814673Slinton sourcepath = $3; 3099683Slinton } 3109683Slinton } 311*16604Ssam | 312*16604Ssam search_command 313*16604Ssam { 314*16604Ssam $$ = $1; 315*16604Ssam } 3169683Slinton ; 317*16604Ssam 318*16604Ssam 319*16604Ssam search_command: 320*16604Ssam '/' pattern 321*16604Ssam { 322*16604Ssam $$ = build(O_SEARCH, build(O_LCON, 1), $2); 323*16604Ssam } 324*16604Ssam | 325*16604Ssam '?' pattern 326*16604Ssam { 327*16604Ssam $$ = build(O_SEARCH, build(O_LCON, 0), $2); 328*16604Ssam } 329*16604Ssam ; 330*16604Ssam 331*16604Ssam pattern: 332*16604Ssam STRING 333*16604Ssam { 334*16604Ssam $$ = build(O_SCON, $1); 335*16604Ssam } 336*16604Ssam ; 337*16604Ssam 3389683Slinton runcommand: 33912524Slinton run { arginit(); } arglist 34012482Slinton | 34112524Slinton run 3429683Slinton ; 3439683Slinton run: 34412524Slinton RUN shellmode 3459683Slinton { 3469683Slinton fflush(stdout); 3479683Slinton } 3489683Slinton ; 3499683Slinton arglist: 3509683Slinton arglist arg 3519683Slinton | 35212482Slinton arg 3539683Slinton ; 3549683Slinton arg: 3559683Slinton NAME 3569683Slinton { 3579683Slinton newarg(ident($1)); 3589683Slinton } 3599683Slinton | 3609683Slinton '<' NAME 3619683Slinton { 3629683Slinton inarg(ident($2)); 3639683Slinton } 3649683Slinton | 3659683Slinton '>' NAME 3669683Slinton { 3679683Slinton outarg(ident($2)); 3689683Slinton } 3699683Slinton ; 3709683Slinton step: 3719683Slinton STEP 3729683Slinton { 3739683Slinton $$ = build(O_STEP, true, false); 3749683Slinton } 3759683Slinton | 3769683Slinton STEPI 3779683Slinton { 3789683Slinton $$ = build(O_STEP, false, false); 3799683Slinton } 3809683Slinton | 3819683Slinton NEXT 3829683Slinton { 3839683Slinton $$ = build(O_STEP, true, true); 3849683Slinton } 3859683Slinton | 3869683Slinton NEXTI 3879683Slinton { 3889683Slinton $$ = build(O_STEP, false, true); 3899683Slinton } 3909683Slinton ; 3919683Slinton shellmode: 3929683Slinton /* empty */ 3939683Slinton { 3949683Slinton beginshellmode(); 3959683Slinton } 3969683Slinton ; 3979683Slinton sourcepath: 3989683Slinton sourcepath NAME 3999683Slinton { 40014673Slinton $$ = $1; 40114673Slinton list_append(list_item(ident($2)), nil, $$); 4029683Slinton } 4039683Slinton | 4049683Slinton /* empty */ 4059683Slinton { 40614673Slinton $$ = list_alloc(); 4079683Slinton } 4089683Slinton ; 4099683Slinton event: 4109683Slinton where 4119683Slinton | 4129683Slinton exp 4139683Slinton ; 4149683Slinton actions: 4159683Slinton actions cmd ';' 4169683Slinton { 4179683Slinton $$ = $1; 4189683Slinton cmdlist_append($2, $$); 4199683Slinton } 4209683Slinton | 4219683Slinton cmd ';' 4229683Slinton { 4239683Slinton $$ = list_alloc(); 4249683Slinton cmdlist_append($1, $$); 4259683Slinton } 4269683Slinton ; 4279683Slinton cmd: 4289683Slinton command 4299683Slinton | 4309683Slinton rcommand 4319683Slinton ; 4329683Slinton 4339683Slinton /* 4349683Slinton * Redirectable commands. 4359683Slinton */ 4369683Slinton rcommand: 4379683Slinton PRINT exp_list 4389683Slinton { 4399683Slinton $$ = build(O_PRINT, $2); 4409683Slinton } 4419683Slinton | 4429683Slinton WHERE 4439683Slinton { 4449683Slinton $$ = build(O_WHERE); 4459683Slinton } 4469683Slinton | 4479683Slinton examine 4489683Slinton { 4499683Slinton $$ = $1; 4509683Slinton } 4519683Slinton | 4529683Slinton CALL term 4539683Slinton { 4549683Slinton $$ = $2; 4559683Slinton } 4569683Slinton | 45712536Scsvaf DEBUG INT 45812536Scsvaf { 45912536Scsvaf $$ = build(O_DEBUG, $2); 46012536Scsvaf } 46112536Scsvaf | 4629683Slinton DUMP 4639683Slinton { 4649683Slinton $$ = build(O_DUMP); 4659683Slinton } 4669683Slinton | 4679683Slinton STATUS 4689683Slinton { 4699683Slinton $$ = build(O_STATUS); 4709683Slinton } 4719683Slinton ; 4729683Slinton alias_command: 4739683Slinton ALIAS name name 4749683Slinton { 4759683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 4769683Slinton } 4779683Slinton | 4789683Slinton ALIAS name 4799683Slinton { 4809683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 4819683Slinton } 4829683Slinton | 4839683Slinton ALIAS 4849683Slinton { 4859683Slinton $$ = build(O_ALIAS, nil, nil); 4869683Slinton } 4879683Slinton ; 4889683Slinton trace: 4899683Slinton TRACE 4909683Slinton { 4919683Slinton $$ = O_TRACE; 4929683Slinton } 4939683Slinton | 4949683Slinton TRACEI 4959683Slinton { 4969683Slinton $$ = O_TRACEI; 4979683Slinton } 4989683Slinton ; 4999683Slinton stop: 5009683Slinton STOP 5019683Slinton { 5029683Slinton $$ = O_STOP; 5039683Slinton } 5049683Slinton | 5059683Slinton STOPI 5069683Slinton { 5079683Slinton $$ = O_STOPI; 5089683Slinton } 5099683Slinton ; 5109683Slinton what: 5119683Slinton exp 5129683Slinton { 5139683Slinton $$ = $1; 5149683Slinton } 5159683Slinton | 5169683Slinton STRING ':' line_number 5179683Slinton { 5189683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 5199683Slinton } 5209683Slinton ; 5219683Slinton where: 5229683Slinton IN term 5239683Slinton { 5249683Slinton $$ = $2; 5259683Slinton } 5269683Slinton | 5279683Slinton AT line_number 5289683Slinton { 5299683Slinton $$ = build(O_QLINE, build(O_SCON, cursource), $2); 5309683Slinton } 5319683Slinton | 5329683Slinton AT STRING ':' line_number 5339683Slinton { 5349683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 5359683Slinton } 5369683Slinton ; 5379683Slinton filename: 5389683Slinton NAME 5399683Slinton { 5409683Slinton $$ = ident($1); 5419683Slinton } 5429683Slinton ; 5439683Slinton opt_filename: 5449683Slinton /* empty */ 5459683Slinton { 5469683Slinton $$ = nil; 5479683Slinton } 5489683Slinton | 5499683Slinton filename 5509683Slinton { 5519683Slinton $$ = $1; 5529683Slinton } 5539683Slinton ; 55412482Slinton opt_exp_list: 55512482Slinton exp_list 5569683Slinton { 55712482Slinton $$ = $1; 5589683Slinton } 5599683Slinton | 56012482Slinton /* empty */ 5619683Slinton { 56212482Slinton $$ = nil; 5639683Slinton } 5649683Slinton ; 5659683Slinton list_command: 5669683Slinton LIST 5679683Slinton { 5689683Slinton $$ = build(O_LIST, 5699683Slinton build(O_LCON, (long) cursrcline), 5709683Slinton build(O_LCON, (long) cursrcline + 9) 5719683Slinton ); 5729683Slinton } 5739683Slinton | 5749683Slinton LIST line_number 5759683Slinton { 5769683Slinton $$ = build(O_LIST, $2, $2); 5779683Slinton } 5789683Slinton | 5799683Slinton LIST line_number ',' line_number 5809683Slinton { 5819683Slinton $$ = build(O_LIST, $2, $4); 5829683Slinton } 5839683Slinton | 5849683Slinton LIST symbol 5859683Slinton { 5869683Slinton $$ = build(O_LIST, $2); 5879683Slinton } 5889683Slinton ; 5899683Slinton line_number: 5909683Slinton INT 5919683Slinton { 5929683Slinton $$ = build(O_LCON, $1); 5939683Slinton } 5949683Slinton | 5959683Slinton '$' 5969683Slinton { 5979683Slinton $$ = build(O_LCON, (long) LASTLINE); 5989683Slinton } 5999683Slinton ; 6009683Slinton examine: 6019683Slinton address '/' count mode 6029683Slinton { 6039683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 6049683Slinton } 6059683Slinton | 6069683Slinton address ',' address '/' mode 6079683Slinton { 6089683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 6099683Slinton } 6109683Slinton | 6119683Slinton '/' count mode 6129683Slinton { 6139683Slinton $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2); 6149683Slinton } 61511173Slinton | 61611173Slinton address '=' mode 61711173Slinton { 61811173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 61911173Slinton } 6209683Slinton ; 6219683Slinton address: 6229683Slinton INT 6239683Slinton { 6249683Slinton $$ = build(O_LCON, $1); 6259683Slinton } 6269683Slinton | 6279683Slinton '&' term 6289683Slinton { 6299683Slinton $$ = amper($2); 6309683Slinton } 6319683Slinton | 6329683Slinton address '+' address 6339683Slinton { 6349683Slinton $$ = build(O_ADD, $1, $3); 6359683Slinton } 6369683Slinton | 6379683Slinton address '-' address 6389683Slinton { 6399683Slinton $$ = build(O_SUB, $1, $3); 6409683Slinton } 6419683Slinton | 6429683Slinton address '*' address 6439683Slinton { 6449683Slinton $$ = build(O_MUL, $1, $3); 6459683Slinton } 6469683Slinton | 6479683Slinton '*' address %prec UNARYSIGN 6489683Slinton { 6499683Slinton $$ = build(O_INDIR, $2); 6509683Slinton } 6519683Slinton | 6529683Slinton '(' exp ')' 6539683Slinton { 6549683Slinton $$ = $2; 6559683Slinton } 6569683Slinton ; 6579683Slinton count: 6589683Slinton /* empty */ 6599683Slinton { 6609683Slinton $$ = 1; 6619683Slinton } 6629683Slinton | 6639683Slinton INT 6649683Slinton { 6659683Slinton $$ = $1; 6669683Slinton } 6679683Slinton ; 6689683Slinton mode: 6699683Slinton name 6709683Slinton { 6719683Slinton $$ = ident($1); 6729683Slinton curformat = $$; 6739683Slinton } 6749683Slinton | 6759683Slinton /* empty */ 6769683Slinton { 6779683Slinton $$ = curformat; 6789683Slinton } 6799683Slinton ; 6809683Slinton opt_cond: 6819683Slinton /* empty */ 6829683Slinton { 6839683Slinton $$ = nil; 6849683Slinton } 6859683Slinton | 6869683Slinton IF boolean_exp 6879683Slinton { 6889683Slinton $$ = $2; 6899683Slinton } 6909683Slinton ; 6919683Slinton exp_list: 6929683Slinton exp 6939683Slinton { 6949683Slinton $$ = build(O_COMMA, $1, nil); 6959683Slinton } 6969683Slinton | 6979683Slinton exp ',' exp_list 6989683Slinton { 6999683Slinton $$ = build(O_COMMA, $1, $3); 7009683Slinton } 7019683Slinton ; 7029683Slinton exp: 7039683Slinton term 7049683Slinton { 7059683Slinton $$ = build(O_RVAL, $1); 7069683Slinton } 7079683Slinton | 7089683Slinton constant 7099683Slinton { 7109683Slinton $$ = $1; 7119683Slinton } 7129683Slinton | 71311173Slinton exp '\\' symbol 71411173Slinton { 71511173Slinton $$ = build(O_TYPERENAME, $1, $3); 71611173Slinton } 71711173Slinton | 7189683Slinton '+' exp %prec UNARYSIGN 7199683Slinton { 7209683Slinton $$ = $2; 7219683Slinton } 7229683Slinton | 7239683Slinton '-' exp %prec UNARYSIGN 7249683Slinton { 7259683Slinton $$ = build(O_NEG, $2); 7269683Slinton } 7279683Slinton | 7289683Slinton '&' exp %prec UNARYSIGN 7299683Slinton { 7309683Slinton $$ = amper($2); 7319683Slinton } 7329683Slinton | 7339683Slinton exp '+' exp 7349683Slinton { 7359683Slinton $$ = build(O_ADD, $1, $3); 7369683Slinton } 7379683Slinton | 7389683Slinton exp '-' exp 7399683Slinton { 7409683Slinton $$ = build(O_SUB, $1, $3); 7419683Slinton } 7429683Slinton | 7439683Slinton exp '*' exp 7449683Slinton { 7459683Slinton $$ = build(O_MUL, $1, $3); 7469683Slinton } 7479683Slinton | 7489683Slinton exp '/' exp 7499683Slinton { 7509683Slinton $$ = build(O_DIVF, $1, $3); 7519683Slinton } 7529683Slinton | 7539683Slinton exp DIV exp 7549683Slinton { 7559683Slinton $$ = build(O_DIV, $1, $3); 7569683Slinton } 7579683Slinton | 7589683Slinton exp MOD exp 7599683Slinton { 7609683Slinton $$ = build(O_MOD, $1, $3); 7619683Slinton } 7629683Slinton | 7639683Slinton exp AND exp 7649683Slinton { 7659683Slinton $$ = build(O_AND, $1, $3); 7669683Slinton } 7679683Slinton | 7689683Slinton exp OR exp 7699683Slinton { 7709683Slinton $$ = build(O_OR, $1, $3); 7719683Slinton } 7729683Slinton | 7739683Slinton exp '<' exp 7749683Slinton { 7759683Slinton $$ = build(O_LT, $1, $3); 7769683Slinton } 7779683Slinton | 7789683Slinton exp '<' '=' exp 7799683Slinton { 7809683Slinton $$ = build(O_LE, $1, $4); 7819683Slinton } 7829683Slinton | 7839683Slinton exp '>' exp 7849683Slinton { 7859683Slinton $$ = build(O_GT, $1, $3); 7869683Slinton } 7879683Slinton | 7889683Slinton exp '>' '=' exp 7899683Slinton { 7909683Slinton $$ = build(O_GE, $1, $4); 7919683Slinton } 7929683Slinton | 7939683Slinton exp '=' exp 7949683Slinton { 7959683Slinton $$ = build(O_EQ, $1, $3); 7969683Slinton } 7979683Slinton | 7989683Slinton exp '=' '=' exp 7999683Slinton { 8009683Slinton $$ = build(O_EQ, $1, $4); 8019683Slinton } 8029683Slinton | 8039683Slinton exp '<' '>' exp 8049683Slinton { 8059683Slinton $$ = build(O_NE, $1, $4); 8069683Slinton } 8079683Slinton | 8089683Slinton exp '!' '=' exp 8099683Slinton { 8109683Slinton $$ = build(O_NE, $1, $4); 8119683Slinton } 8129683Slinton | 8139683Slinton '(' exp ')' 8149683Slinton { 8159683Slinton $$ = $2; 8169683Slinton } 8179683Slinton ; 8189683Slinton term: 8199683Slinton symbol 8209683Slinton { 8219683Slinton $$ = $1; 8229683Slinton } 8239683Slinton | 8249683Slinton term '[' exp_list ']' 8259683Slinton { 8269683Slinton $$ = subscript($1, $3); 8279683Slinton } 8289683Slinton | 8299683Slinton term '.' name 8309683Slinton { 8319683Slinton $$ = dot($1, $3); 8329683Slinton } 8339683Slinton | 8349683Slinton term ARROW name 8359683Slinton { 8369683Slinton $$ = dot($1, $3); 8379683Slinton } 8389683Slinton | 8399683Slinton '*' term %prec UNARYSIGN 8409683Slinton { 8419683Slinton $$ = build(O_INDIR, $2); 8429683Slinton } 8439683Slinton | 8449683Slinton '*' '(' exp ')' %prec UNARYSIGN 8459683Slinton { 8469683Slinton $$ = build(O_INDIR, $3); 8479683Slinton } 8489683Slinton | 8499683Slinton term '^' %prec UNARYSIGN 8509683Slinton { 8519683Slinton $$ = build(O_INDIR, $1); 8529683Slinton } 8539683Slinton | 8549683Slinton '#' term %prec UNARYSIGN 8559683Slinton { 8569683Slinton $$ = concrete($2); 8579683Slinton } 8589683Slinton | 85912482Slinton term '(' opt_exp_list ')' 8609683Slinton { 8619683Slinton $$ = build(O_CALL, $1, $3); 8629683Slinton } 8639683Slinton ; 8649683Slinton boolean_exp: 8659683Slinton exp 8669683Slinton { 8679683Slinton chkboolean($1); 8689683Slinton $$ = $1; 8699683Slinton } 8709683Slinton ; 8719683Slinton constant: 8729683Slinton INT 8739683Slinton { 8749683Slinton $$ = build(O_LCON, $1); 8759683Slinton } 8769683Slinton | 8779683Slinton REAL 8789683Slinton { 8799683Slinton $$ = build(O_FCON, $1); 8809683Slinton } 8819683Slinton | 8829683Slinton STRING 8839683Slinton { 8849683Slinton $$ = build(O_SCON, $1); 8859683Slinton } 8869683Slinton ; 8879683Slinton symbol: 8889683Slinton name 8899683Slinton { 8909683Slinton $$ = build(O_SYM, which($1)); 8919683Slinton } 8929683Slinton ; 8939683Slinton name: 8949683Slinton NAME 8959683Slinton { 8969683Slinton $$ = $1; 8979683Slinton } 8989683Slinton | 8999683Slinton keyword 9009683Slinton { 9019683Slinton $$ = $1; 9029683Slinton } 9039683Slinton keyword: 90412536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 90512536Scsvaf DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD | 9069683Slinton NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN | 9079683Slinton SH | SKIP | SOURCE | STATUS | STEP | STEPI | 9089683Slinton STOP | STOPI | TRACE | TRACEI | 90913840Slinton USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH 9109683Slinton ; 911