19683Slinton %{ 29683Slinton 39683Slinton /* Copyright (c) 1982 Regents of the University of California */ 49683Slinton 5*16607Ssam static char sccsid[] = "@(#)commands.y 1.9 8/17/83"; 69683Slinton 7*16607Ssam static char rcsid[] = "$Header: commands.y,v 1.3 84/03/27 10:19:59 linton Exp $"; 8*16607Ssam 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" 209683Slinton #include "names.h" 2114673Slinton #include "lists.h" 229683Slinton 239683Slinton private String curformat = "X"; 249683Slinton 259683Slinton %} 269683Slinton 279683Slinton %term 28*16607Ssam ALIAS AND ASSIGN AT CALL CATCH CONT DEBUG DELETE DIV DOWN DUMP 299683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 30*16607Ssam PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS STEP STEPI 31*16607Ssam STOP STOPI TRACE TRACEI UP 329683Slinton USE WHATIS WHEN WHERE WHEREIS WHICH 339683Slinton 349683Slinton %term INT REAL NAME STRING 359683Slinton %term LFORMER RFORMER ABSTRACTION ARROW 369683Slinton 379683Slinton %right INT 389683Slinton %binary REDIRECT 399683Slinton %binary '<' '=' '>' '!' IN 409683Slinton %left '+' '-' OR 419683Slinton %left UNARYSIGN 429683Slinton %left '*' '/' DIV MOD AND 439683Slinton %left NOT '(' '[' '.' '^' ARROW 4411173Slinton %left '\\' 459683Slinton 469683Slinton %union { 479683Slinton Name y_name; 489683Slinton Symbol y_sym; 499683Slinton Node y_node; 509683Slinton Integer y_int; 519683Slinton Operator y_op; 529683Slinton long y_long; 539683Slinton double y_real; 549683Slinton String y_string; 559683Slinton Boolean y_bool; 569683Slinton Cmdlist y_cmdlist; 5714673Slinton List y_list; 589683Slinton }; 599683Slinton 609683Slinton %type <y_op> trace stop 619683Slinton %type <y_long> INT count 629683Slinton %type <y_real> REAL 639683Slinton %type <y_string> STRING redirectout filename opt_filename mode 64*16607Ssam %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT 65*16607Ssam %type <y_name> DEBUG DELETE DIV DOWN DUMP 669683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 679683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 68*16607Ssam %type <y_name> PRINT PSYM QUIT RERUN RETURN RUN SH SKIP SOURCE STATUS 69*16607Ssam %type <y_name> STEP STEPI STOP STOPI TRACE TRACEI 70*16607Ssam %type <y_name> UP USE WHATIS WHEN WHERE WHEREIS WHICH 719683Slinton %type <y_name> name NAME keyword 72*16607Ssam %type <y_node> opt_qual_symbol symbol 739683Slinton %type <y_node> command rcommand cmd step what where examine 7412482Slinton %type <y_node> event opt_exp_list opt_cond 759683Slinton %type <y_node> exp_list exp term boolean_exp constant address 76*16607Ssam %type <y_node> integer_list alias_command list_command line_number 779683Slinton %type <y_cmdlist> actions 7814673Slinton %type <y_list> sourcepath 799683Slinton 809683Slinton %% 819683Slinton 829683Slinton input: 839683Slinton input command_nl 849683Slinton | 859683Slinton /* empty */ 869683Slinton ; 879683Slinton command_nl: 889683Slinton command_line '\n' 899683Slinton | 909683Slinton command_line ';' 919683Slinton | 929683Slinton '\n' 939683Slinton ; 949683Slinton 959683Slinton command_line: 969683Slinton command 979683Slinton { 989683Slinton if ($1 != nil) { 9912536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1009683Slinton eval($1); 1019683Slinton } 1029683Slinton } 1039683Slinton | 1049683Slinton rcommand redirectout 1059683Slinton { 1069683Slinton if ($1 != nil) { 1079683Slinton if ($2 != nil) { 1089683Slinton setout($2); 10912536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1109683Slinton eval($1); 1119683Slinton unsetout(); 1129683Slinton } else { 11312536Scsvaf if(debug_flag[2]) {dumptree(stderr,$1); fflush (stderr);} 1149683Slinton eval($1); 1159683Slinton } 1169683Slinton } 1179683Slinton } 1189683Slinton ; 1199683Slinton redirectout: 1209683Slinton '>' shellmode NAME 1219683Slinton { 1229683Slinton $$ = ident($3); 1239683Slinton } 1249683Slinton | 1259683Slinton /* empty */ 1269683Slinton { 1279683Slinton $$ = nil; 1289683Slinton } 1299683Slinton ; 1309683Slinton 1319683Slinton /* 1329683Slinton * Non-redirectable commands. 1339683Slinton */ 1349683Slinton command: 1359683Slinton alias_command 1369683Slinton { 1379683Slinton $$ = $1; 1389683Slinton } 1399683Slinton | 1409683Slinton ASSIGN term '=' exp 1419683Slinton { 1429683Slinton $$ = build(O_ASSIGN, $2, $4); 1439683Slinton } 1449683Slinton | 1459683Slinton CATCH INT 1469683Slinton { 1479683Slinton $$ = build(O_CATCH, $2); 1489683Slinton } 1499683Slinton | 1509683Slinton CONT 1519683Slinton { 15214673Slinton $$ = build(O_CONT, (long) DEFSIG); 1539683Slinton } 1549683Slinton | 15511870Slinton CONT INT 15611870Slinton { 15711870Slinton $$ = build(O_CONT, $2); 15811870Slinton } 15911870Slinton | 160*16607Ssam DELETE integer_list 1619683Slinton { 1629683Slinton $$ = build(O_DELETE, $2); 1639683Slinton } 1649683Slinton | 165*16607Ssam DOWN 166*16607Ssam { 167*16607Ssam $$ = build(O_DOWN, build(O_LCON, (long) 1)); 168*16607Ssam } 169*16607Ssam | 170*16607Ssam DOWN INT 171*16607Ssam { 172*16607Ssam $$ = build(O_DOWN, build(O_LCON, (long) $2)); 173*16607Ssam } 174*16607Ssam | 1759683Slinton EDIT shellmode opt_filename 1769683Slinton { 1779683Slinton $$ = build(O_EDIT, $3); 1789683Slinton } 1799683Slinton | 1809683Slinton FILE shellmode opt_filename 1819683Slinton { 1829683Slinton $$ = build(O_CHFILE, $3); 1839683Slinton } 1849683Slinton | 1859683Slinton FUNC 1869683Slinton { 1879683Slinton $$ = build(O_FUNC, nil); 1889683Slinton } 1899683Slinton | 190*16607Ssam FUNC opt_qual_symbol 1919683Slinton { 1929683Slinton $$ = build(O_FUNC, $2); 1939683Slinton } 1949683Slinton | 1959683Slinton GRIPE 1969683Slinton { 1979683Slinton $$ = build(O_GRIPE); 1989683Slinton } 1999683Slinton | 2009683Slinton HELP 2019683Slinton { 2029683Slinton $$ = build(O_HELP); 2039683Slinton } 2049683Slinton | 2059683Slinton IGNORE INT 2069683Slinton { 2079683Slinton $$ = build(O_IGNORE, $2); 2089683Slinton } 2099683Slinton | 2109683Slinton list_command 2119683Slinton { 2129683Slinton $$ = $1; 2139683Slinton } 2149683Slinton | 2159683Slinton PSYM term 2169683Slinton { 2179683Slinton $$ = build(O_PSYM, $2); 2189683Slinton } 2199683Slinton | 2209683Slinton QUIT 2219683Slinton { 2229683Slinton if (not popinput()) { 2239683Slinton quit(0); 2249683Slinton } else { 2259683Slinton $$ = nil; 2269683Slinton } 2279683Slinton } 2289683Slinton | 229*16607Ssam RETURN 230*16607Ssam { 231*16607Ssam $$ = build(O_RETURN, nil); 232*16607Ssam } 233*16607Ssam | 234*16607Ssam RETURN opt_qual_symbol 235*16607Ssam { 236*16607Ssam $$ = build(O_RETURN, $2); 237*16607Ssam } 238*16607Ssam | 2399683Slinton runcommand 2409683Slinton { 2419683Slinton run(); 2429683Slinton /* NOTREACHED */ 2439683Slinton } 2449683Slinton | 2459683Slinton SH 2469683Slinton { 2479683Slinton shellline(); 2489683Slinton $$ = nil; 2499683Slinton } 2509683Slinton | 2519683Slinton SOURCE shellmode filename 2529683Slinton { 2539683Slinton $$ = build(O_SOURCE, $3); 2549683Slinton } 2559683Slinton | 2569683Slinton step 2579683Slinton { 2589683Slinton $$ = $1; 2599683Slinton } 2609683Slinton | 2619683Slinton stop where opt_cond 2629683Slinton { 2639683Slinton $$ = build($1, nil, $2, $3); 2649683Slinton } 2659683Slinton | 2669683Slinton stop what opt_cond 2679683Slinton { 2689683Slinton $$ = build($1, $2, nil, $3); 2699683Slinton } 2709683Slinton | 2719683Slinton stop IF boolean_exp 2729683Slinton { 2739683Slinton $$ = build($1, nil, nil, $3); 2749683Slinton } 2759683Slinton | 2769683Slinton trace what where opt_cond 2779683Slinton { 2789683Slinton $$ = build($1, $2, $3, $4); 2799683Slinton } 2809683Slinton | 2819683Slinton trace where opt_cond 2829683Slinton { 2839683Slinton $$ = build($1, nil, $2, $3); 2849683Slinton } 2859683Slinton | 2869683Slinton trace what opt_cond 2879683Slinton { 2889683Slinton $$ = build($1, $2, nil, $3); 2899683Slinton } 2909683Slinton | 2919683Slinton trace opt_cond 2929683Slinton { 2939683Slinton $$ = build($1, nil, nil, $2); 2949683Slinton } 2959683Slinton | 296*16607Ssam UP 2979683Slinton { 298*16607Ssam $$ = build(O_UP, build(O_LCON, (long) 1)); 2999683Slinton } 3009683Slinton | 301*16607Ssam UP INT 3029683Slinton { 303*16607Ssam $$ = build(O_UP, build(O_LCON, (long) $2)); 3049683Slinton } 3059683Slinton | 3069683Slinton USE shellmode sourcepath 3079683Slinton { 30814673Slinton String dir; 30914673Slinton 3109683Slinton $$ = nil; 31114673Slinton if (list_size($3) == 0) { 31214673Slinton foreach (String, dir, sourcepath) 31314673Slinton printf("%s ", dir); 31414673Slinton endfor 31514673Slinton printf("\n"); 31614673Slinton } else { 31714673Slinton foreach (String, dir, sourcepath) 31814673Slinton list_delete(list_curitem(sourcepath), sourcepath); 31914673Slinton endfor 32014673Slinton sourcepath = $3; 3219683Slinton } 3229683Slinton } 32316604Ssam | 324*16607Ssam WHATIS term 32516604Ssam { 326*16607Ssam $$ = build(O_WHATIS, $2); 32716604Ssam } 328*16607Ssam | 329*16607Ssam WHEN event '{' actions '}' 33016604Ssam { 331*16607Ssam $$ = build(O_ADDEVENT, $2, $4); 33216604Ssam } 33316604Ssam | 334*16607Ssam WHEREIS symbol 33516604Ssam { 336*16607Ssam $$ = build(O_WHEREIS, $2); 33716604Ssam } 338*16607Ssam | 339*16607Ssam WHICH symbol 34016604Ssam { 341*16607Ssam $$ = build(O_WHICH, $2); 34216604Ssam } 34316604Ssam ; 3449683Slinton runcommand: 345*16607Ssam run arglist 34612482Slinton | 34712524Slinton run 3489683Slinton ; 3499683Slinton run: 35012524Slinton RUN shellmode 3519683Slinton { 352*16607Ssam arginit(); 3539683Slinton fflush(stdout); 3549683Slinton } 355*16607Ssam | 356*16607Ssam RERUN shellmode 357*16607Ssam { 358*16607Ssam fflush(stdout); 359*16607Ssam } 3609683Slinton ; 3619683Slinton arglist: 3629683Slinton arglist arg 3639683Slinton | 36412482Slinton arg 3659683Slinton ; 3669683Slinton arg: 3679683Slinton NAME 3689683Slinton { 3699683Slinton newarg(ident($1)); 3709683Slinton } 3719683Slinton | 372*16607Ssam STRING 373*16607Ssam { 374*16607Ssam newarg($1); 375*16607Ssam } 376*16607Ssam | 3779683Slinton '<' NAME 3789683Slinton { 3799683Slinton inarg(ident($2)); 3809683Slinton } 3819683Slinton | 3829683Slinton '>' NAME 3839683Slinton { 3849683Slinton outarg(ident($2)); 3859683Slinton } 3869683Slinton ; 3879683Slinton step: 3889683Slinton STEP 3899683Slinton { 3909683Slinton $$ = build(O_STEP, true, false); 3919683Slinton } 3929683Slinton | 3939683Slinton STEPI 3949683Slinton { 3959683Slinton $$ = build(O_STEP, false, false); 3969683Slinton } 3979683Slinton | 3989683Slinton NEXT 3999683Slinton { 4009683Slinton $$ = build(O_STEP, true, true); 4019683Slinton } 4029683Slinton | 4039683Slinton NEXTI 4049683Slinton { 4059683Slinton $$ = build(O_STEP, false, true); 4069683Slinton } 4079683Slinton ; 4089683Slinton shellmode: 4099683Slinton /* empty */ 4109683Slinton { 4119683Slinton beginshellmode(); 4129683Slinton } 4139683Slinton ; 4149683Slinton sourcepath: 4159683Slinton sourcepath NAME 4169683Slinton { 41714673Slinton $$ = $1; 41814673Slinton list_append(list_item(ident($2)), nil, $$); 4199683Slinton } 4209683Slinton | 4219683Slinton /* empty */ 4229683Slinton { 42314673Slinton $$ = list_alloc(); 4249683Slinton } 4259683Slinton ; 4269683Slinton event: 4279683Slinton where 4289683Slinton | 4299683Slinton exp 4309683Slinton ; 4319683Slinton actions: 4329683Slinton actions cmd ';' 4339683Slinton { 4349683Slinton $$ = $1; 4359683Slinton cmdlist_append($2, $$); 4369683Slinton } 4379683Slinton | 4389683Slinton cmd ';' 4399683Slinton { 4409683Slinton $$ = list_alloc(); 4419683Slinton cmdlist_append($1, $$); 4429683Slinton } 4439683Slinton ; 4449683Slinton cmd: 4459683Slinton command 4469683Slinton | 4479683Slinton rcommand 4489683Slinton ; 4499683Slinton 4509683Slinton /* 4519683Slinton * Redirectable commands. 4529683Slinton */ 4539683Slinton rcommand: 4549683Slinton PRINT exp_list 4559683Slinton { 4569683Slinton $$ = build(O_PRINT, $2); 4579683Slinton } 4589683Slinton | 4599683Slinton WHERE 4609683Slinton { 4619683Slinton $$ = build(O_WHERE); 4629683Slinton } 4639683Slinton | 4649683Slinton examine 4659683Slinton { 4669683Slinton $$ = $1; 4679683Slinton } 4689683Slinton | 469*16607Ssam CALL term '(' opt_exp_list ')' 4709683Slinton { 471*16607Ssam $$ = build(O_CALL, $2, $4); 4729683Slinton } 4739683Slinton | 47412536Scsvaf DEBUG INT 47512536Scsvaf { 47612536Scsvaf $$ = build(O_DEBUG, $2); 47712536Scsvaf } 47812536Scsvaf | 4799683Slinton DUMP 4809683Slinton { 4819683Slinton $$ = build(O_DUMP); 4829683Slinton } 4839683Slinton | 4849683Slinton STATUS 4859683Slinton { 4869683Slinton $$ = build(O_STATUS); 4879683Slinton } 4889683Slinton ; 4899683Slinton alias_command: 4909683Slinton ALIAS name name 4919683Slinton { 4929683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 4939683Slinton } 4949683Slinton | 4959683Slinton ALIAS name 4969683Slinton { 4979683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 4989683Slinton } 4999683Slinton | 5009683Slinton ALIAS 5019683Slinton { 5029683Slinton $$ = build(O_ALIAS, nil, nil); 5039683Slinton } 5049683Slinton ; 5059683Slinton trace: 5069683Slinton TRACE 5079683Slinton { 5089683Slinton $$ = O_TRACE; 5099683Slinton } 5109683Slinton | 5119683Slinton TRACEI 5129683Slinton { 5139683Slinton $$ = O_TRACEI; 5149683Slinton } 5159683Slinton ; 5169683Slinton stop: 5179683Slinton STOP 5189683Slinton { 5199683Slinton $$ = O_STOP; 5209683Slinton } 5219683Slinton | 5229683Slinton STOPI 5239683Slinton { 5249683Slinton $$ = O_STOPI; 5259683Slinton } 5269683Slinton ; 5279683Slinton what: 5289683Slinton exp 5299683Slinton { 5309683Slinton $$ = $1; 5319683Slinton } 5329683Slinton | 5339683Slinton STRING ':' line_number 5349683Slinton { 5359683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 5369683Slinton } 5379683Slinton ; 5389683Slinton where: 5399683Slinton IN term 5409683Slinton { 5419683Slinton $$ = $2; 5429683Slinton } 5439683Slinton | 5449683Slinton AT line_number 5459683Slinton { 5469683Slinton $$ = build(O_QLINE, build(O_SCON, cursource), $2); 5479683Slinton } 5489683Slinton | 5499683Slinton AT STRING ':' line_number 5509683Slinton { 5519683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 5529683Slinton } 5539683Slinton ; 5549683Slinton filename: 5559683Slinton NAME 5569683Slinton { 5579683Slinton $$ = ident($1); 5589683Slinton } 5599683Slinton ; 5609683Slinton opt_filename: 5619683Slinton /* empty */ 5629683Slinton { 5639683Slinton $$ = nil; 5649683Slinton } 5659683Slinton | 5669683Slinton filename 5679683Slinton { 5689683Slinton $$ = $1; 5699683Slinton } 5709683Slinton ; 57112482Slinton opt_exp_list: 57212482Slinton exp_list 5739683Slinton { 57412482Slinton $$ = $1; 5759683Slinton } 5769683Slinton | 57712482Slinton /* empty */ 5789683Slinton { 57912482Slinton $$ = nil; 5809683Slinton } 5819683Slinton ; 5829683Slinton list_command: 5839683Slinton LIST 5849683Slinton { 5859683Slinton $$ = build(O_LIST, 5869683Slinton build(O_LCON, (long) cursrcline), 5879683Slinton build(O_LCON, (long) cursrcline + 9) 5889683Slinton ); 5899683Slinton } 5909683Slinton | 5919683Slinton LIST line_number 5929683Slinton { 5939683Slinton $$ = build(O_LIST, $2, $2); 5949683Slinton } 5959683Slinton | 5969683Slinton LIST line_number ',' line_number 5979683Slinton { 5989683Slinton $$ = build(O_LIST, $2, $4); 5999683Slinton } 6009683Slinton | 601*16607Ssam LIST opt_qual_symbol 6029683Slinton { 6039683Slinton $$ = build(O_LIST, $2); 6049683Slinton } 6059683Slinton ; 606*16607Ssam integer_list: 607*16607Ssam INT 608*16607Ssam { 609*16607Ssam $$ = build(O_LCON, $1); 610*16607Ssam } 611*16607Ssam | 612*16607Ssam INT integer_list 613*16607Ssam { 614*16607Ssam $$ = build(O_COMMA, build(O_LCON, $1), $2); 615*16607Ssam } 616*16607Ssam ; 6179683Slinton line_number: 6189683Slinton INT 6199683Slinton { 6209683Slinton $$ = build(O_LCON, $1); 6219683Slinton } 6229683Slinton | 6239683Slinton '$' 6249683Slinton { 6259683Slinton $$ = build(O_LCON, (long) LASTLINE); 6269683Slinton } 6279683Slinton ; 6289683Slinton examine: 6299683Slinton address '/' count mode 6309683Slinton { 6319683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 6329683Slinton } 6339683Slinton | 6349683Slinton address ',' address '/' mode 6359683Slinton { 6369683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 6379683Slinton } 6389683Slinton | 6399683Slinton '/' count mode 6409683Slinton { 6419683Slinton $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2); 6429683Slinton } 64311173Slinton | 64411173Slinton address '=' mode 64511173Slinton { 64611173Slinton $$ = build(O_EXAMINE, $3, $1, nil, 0); 64711173Slinton } 6489683Slinton ; 6499683Slinton address: 6509683Slinton INT 6519683Slinton { 6529683Slinton $$ = build(O_LCON, $1); 6539683Slinton } 6549683Slinton | 6559683Slinton '&' term 6569683Slinton { 6579683Slinton $$ = amper($2); 6589683Slinton } 6599683Slinton | 6609683Slinton address '+' address 6619683Slinton { 6629683Slinton $$ = build(O_ADD, $1, $3); 6639683Slinton } 6649683Slinton | 6659683Slinton address '-' address 6669683Slinton { 6679683Slinton $$ = build(O_SUB, $1, $3); 6689683Slinton } 6699683Slinton | 6709683Slinton address '*' address 6719683Slinton { 6729683Slinton $$ = build(O_MUL, $1, $3); 6739683Slinton } 6749683Slinton | 6759683Slinton '*' address %prec UNARYSIGN 6769683Slinton { 6779683Slinton $$ = build(O_INDIR, $2); 6789683Slinton } 6799683Slinton | 6809683Slinton '(' exp ')' 6819683Slinton { 6829683Slinton $$ = $2; 6839683Slinton } 6849683Slinton ; 6859683Slinton count: 6869683Slinton /* empty */ 6879683Slinton { 6889683Slinton $$ = 1; 6899683Slinton } 6909683Slinton | 6919683Slinton INT 6929683Slinton { 6939683Slinton $$ = $1; 6949683Slinton } 6959683Slinton ; 6969683Slinton mode: 6979683Slinton name 6989683Slinton { 6999683Slinton $$ = ident($1); 7009683Slinton curformat = $$; 7019683Slinton } 7029683Slinton | 7039683Slinton /* empty */ 7049683Slinton { 7059683Slinton $$ = curformat; 7069683Slinton } 7079683Slinton ; 7089683Slinton opt_cond: 7099683Slinton /* empty */ 7109683Slinton { 7119683Slinton $$ = nil; 7129683Slinton } 7139683Slinton | 7149683Slinton IF boolean_exp 7159683Slinton { 7169683Slinton $$ = $2; 7179683Slinton } 7189683Slinton ; 7199683Slinton exp_list: 7209683Slinton exp 7219683Slinton { 7229683Slinton $$ = build(O_COMMA, $1, nil); 7239683Slinton } 7249683Slinton | 7259683Slinton exp ',' exp_list 7269683Slinton { 7279683Slinton $$ = build(O_COMMA, $1, $3); 7289683Slinton } 7299683Slinton ; 7309683Slinton exp: 7319683Slinton term 7329683Slinton { 7339683Slinton $$ = build(O_RVAL, $1); 7349683Slinton } 7359683Slinton | 7369683Slinton constant 7379683Slinton { 7389683Slinton $$ = $1; 7399683Slinton } 7409683Slinton | 741*16607Ssam exp '\\' opt_qual_symbol 74211173Slinton { 74311173Slinton $$ = build(O_TYPERENAME, $1, $3); 74411173Slinton } 74511173Slinton | 7469683Slinton '+' exp %prec UNARYSIGN 7479683Slinton { 7489683Slinton $$ = $2; 7499683Slinton } 7509683Slinton | 7519683Slinton '-' exp %prec UNARYSIGN 7529683Slinton { 7539683Slinton $$ = build(O_NEG, $2); 7549683Slinton } 7559683Slinton | 7569683Slinton '&' exp %prec UNARYSIGN 7579683Slinton { 7589683Slinton $$ = amper($2); 7599683Slinton } 7609683Slinton | 7619683Slinton exp '+' exp 7629683Slinton { 7639683Slinton $$ = build(O_ADD, $1, $3); 7649683Slinton } 7659683Slinton | 7669683Slinton exp '-' exp 7679683Slinton { 7689683Slinton $$ = build(O_SUB, $1, $3); 7699683Slinton } 7709683Slinton | 7719683Slinton exp '*' exp 7729683Slinton { 7739683Slinton $$ = build(O_MUL, $1, $3); 7749683Slinton } 7759683Slinton | 7769683Slinton exp '/' exp 7779683Slinton { 7789683Slinton $$ = build(O_DIVF, $1, $3); 7799683Slinton } 7809683Slinton | 7819683Slinton exp DIV exp 7829683Slinton { 7839683Slinton $$ = build(O_DIV, $1, $3); 7849683Slinton } 7859683Slinton | 7869683Slinton exp MOD exp 7879683Slinton { 7889683Slinton $$ = build(O_MOD, $1, $3); 7899683Slinton } 7909683Slinton | 7919683Slinton exp AND exp 7929683Slinton { 7939683Slinton $$ = build(O_AND, $1, $3); 7949683Slinton } 7959683Slinton | 7969683Slinton exp OR exp 7979683Slinton { 7989683Slinton $$ = build(O_OR, $1, $3); 7999683Slinton } 8009683Slinton | 8019683Slinton exp '<' exp 8029683Slinton { 8039683Slinton $$ = build(O_LT, $1, $3); 8049683Slinton } 8059683Slinton | 8069683Slinton exp '<' '=' exp 8079683Slinton { 8089683Slinton $$ = build(O_LE, $1, $4); 8099683Slinton } 8109683Slinton | 8119683Slinton exp '>' exp 8129683Slinton { 8139683Slinton $$ = build(O_GT, $1, $3); 8149683Slinton } 8159683Slinton | 8169683Slinton exp '>' '=' exp 8179683Slinton { 8189683Slinton $$ = build(O_GE, $1, $4); 8199683Slinton } 8209683Slinton | 8219683Slinton exp '=' exp 8229683Slinton { 8239683Slinton $$ = build(O_EQ, $1, $3); 8249683Slinton } 8259683Slinton | 8269683Slinton exp '=' '=' exp 8279683Slinton { 8289683Slinton $$ = build(O_EQ, $1, $4); 8299683Slinton } 8309683Slinton | 8319683Slinton exp '<' '>' exp 8329683Slinton { 8339683Slinton $$ = build(O_NE, $1, $4); 8349683Slinton } 8359683Slinton | 8369683Slinton exp '!' '=' exp 8379683Slinton { 8389683Slinton $$ = build(O_NE, $1, $4); 8399683Slinton } 8409683Slinton | 8419683Slinton '(' exp ')' 8429683Slinton { 8439683Slinton $$ = $2; 8449683Slinton } 8459683Slinton ; 8469683Slinton term: 8479683Slinton symbol 8489683Slinton { 8499683Slinton $$ = $1; 8509683Slinton } 8519683Slinton | 8529683Slinton term '[' exp_list ']' 8539683Slinton { 8549683Slinton $$ = subscript($1, $3); 8559683Slinton } 8569683Slinton | 8579683Slinton term '.' name 8589683Slinton { 8599683Slinton $$ = dot($1, $3); 8609683Slinton } 8619683Slinton | 8629683Slinton term ARROW name 8639683Slinton { 8649683Slinton $$ = dot($1, $3); 8659683Slinton } 8669683Slinton | 8679683Slinton '*' term %prec UNARYSIGN 8689683Slinton { 8699683Slinton $$ = build(O_INDIR, $2); 8709683Slinton } 8719683Slinton | 8729683Slinton '*' '(' exp ')' %prec UNARYSIGN 8739683Slinton { 8749683Slinton $$ = build(O_INDIR, $3); 8759683Slinton } 8769683Slinton | 8779683Slinton term '^' %prec UNARYSIGN 8789683Slinton { 8799683Slinton $$ = build(O_INDIR, $1); 8809683Slinton } 8819683Slinton | 8829683Slinton '#' term %prec UNARYSIGN 8839683Slinton { 8849683Slinton $$ = concrete($2); 8859683Slinton } 8869683Slinton | 887*16607Ssam '#' '(' exp ')' %prec UNARYSIGN 888*16607Ssam { 889*16607Ssam $$ = concrete($3); 890*16607Ssam } 891*16607Ssam | 89212482Slinton term '(' opt_exp_list ')' 8939683Slinton { 8949683Slinton $$ = build(O_CALL, $1, $3); 8959683Slinton } 8969683Slinton ; 8979683Slinton boolean_exp: 8989683Slinton exp 8999683Slinton { 9009683Slinton chkboolean($1); 9019683Slinton $$ = $1; 9029683Slinton } 9039683Slinton ; 9049683Slinton constant: 9059683Slinton INT 9069683Slinton { 9079683Slinton $$ = build(O_LCON, $1); 9089683Slinton } 9099683Slinton | 9109683Slinton REAL 9119683Slinton { 9129683Slinton $$ = build(O_FCON, $1); 9139683Slinton } 9149683Slinton | 9159683Slinton STRING 9169683Slinton { 9179683Slinton $$ = build(O_SCON, $1); 9189683Slinton } 9199683Slinton ; 920*16607Ssam opt_qual_symbol: 921*16607Ssam symbol 922*16607Ssam { 923*16607Ssam $$ = $1; 924*16607Ssam } 925*16607Ssam | 926*16607Ssam opt_qual_symbol '.' name 927*16607Ssam { 928*16607Ssam $$ = dot($1, $3); 929*16607Ssam } 930*16607Ssam ; 9319683Slinton symbol: 9329683Slinton name 9339683Slinton { 9349683Slinton $$ = build(O_SYM, which($1)); 9359683Slinton } 936*16607Ssam | 937*16607Ssam '.' name 938*16607Ssam { 939*16607Ssam $$ = dot(build(O_SYM, program), $2); 940*16607Ssam } 9419683Slinton ; 9429683Slinton name: 9439683Slinton NAME 9449683Slinton { 9459683Slinton $$ = $1; 9469683Slinton } 9479683Slinton | 9489683Slinton keyword 9499683Slinton { 9509683Slinton $$ = $1; 9519683Slinton } 9529683Slinton keyword: 95312536Scsvaf ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DEBUG | DELETE | DIV | 954*16607Ssam DOWN | DUMP | EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | 955*16607Ssam MOD | NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | 956*16607Ssam RERUN | RETURN | RUN | SH | SKIP | SOURCE | STATUS | STEP | STEPI | 957*16607Ssam STOP | STOPI | TRACE | TRACEI | UP | 95813840Slinton USE | WHATIS | WHEN | WHERE | WHEREIS | WHICH 9599683Slinton ; 960