1*9683Slinton %{ 2*9683Slinton 3*9683Slinton /* Copyright (c) 1982 Regents of the University of California */ 4*9683Slinton 5*9683Slinton static char sccsid[] = "@(#)@(#)commands.y 1.1 12/15/82"; 6*9683Slinton 7*9683Slinton /* 8*9683Slinton * Yacc grammar for debugger commands. 9*9683Slinton */ 10*9683Slinton 11*9683Slinton #include "defs.h" 12*9683Slinton #include "symbols.h" 13*9683Slinton #include "operators.h" 14*9683Slinton #include "tree.h" 15*9683Slinton #include "process.h" 16*9683Slinton #include "source.h" 17*9683Slinton #include "scanner.h" 18*9683Slinton #include "names.h" 19*9683Slinton 20*9683Slinton private String curformat = "X"; 21*9683Slinton 22*9683Slinton %} 23*9683Slinton 24*9683Slinton %term 25*9683Slinton ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP 26*9683Slinton EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD NEXT NEXTI NIL NOT OR 27*9683Slinton PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI 28*9683Slinton STOP STOPI TRACE TRACEI 29*9683Slinton USE WHATIS WHEN WHERE WHEREIS WHICH 30*9683Slinton 31*9683Slinton %term INT REAL NAME STRING 32*9683Slinton %term LFORMER RFORMER ABSTRACTION ARROW 33*9683Slinton 34*9683Slinton %right INT 35*9683Slinton %binary REDIRECT 36*9683Slinton %binary '<' '=' '>' '!' IN 37*9683Slinton %left '+' '-' OR 38*9683Slinton %left UNARYSIGN 39*9683Slinton %left '*' '/' DIV MOD AND 40*9683Slinton %left NOT '(' '[' '.' '^' ARROW 41*9683Slinton 42*9683Slinton %union { 43*9683Slinton Name y_name; 44*9683Slinton Symbol y_sym; 45*9683Slinton Node y_node; 46*9683Slinton Integer y_int; 47*9683Slinton Operator y_op; 48*9683Slinton long y_long; 49*9683Slinton double y_real; 50*9683Slinton String y_string; 51*9683Slinton Boolean y_bool; 52*9683Slinton Cmdlist y_cmdlist; 53*9683Slinton }; 54*9683Slinton 55*9683Slinton %type <y_op> trace stop 56*9683Slinton %type <y_long> INT count 57*9683Slinton %type <y_real> REAL 58*9683Slinton %type <y_string> STRING redirectout filename opt_filename mode 59*9683Slinton %type <y_name> ALIAS AND ASSIGN AT CALL CATCH CONT DELETE DIV DUMP 60*9683Slinton %type <y_name> EDIT FILE FUNC GRIPE HELP IF IGNORE IN LIST MOD 61*9683Slinton %type <y_name> NEXT NEXTI NIL NOT OR 62*9683Slinton %type <y_name> PRINT PSYM QUIT RUN SH SKIP SOURCE STATUS STEP STEPI 63*9683Slinton %type <y_name> STOP STOPI TRACE TRACEI 64*9683Slinton %type <y_name> USE WHATIS WHEN WHERE WHEREIS WHICH 65*9683Slinton %type <y_name> name NAME keyword 66*9683Slinton %type <y_node> symbol 67*9683Slinton %type <y_node> command rcommand cmd step what where examine 68*9683Slinton %type <y_node> event opt_arglist opt_cond 69*9683Slinton %type <y_node> exp_list exp term boolean_exp constant address 70*9683Slinton %type <y_node> alias_command list_command line_number 71*9683Slinton %type <y_cmdlist> actions 72*9683Slinton 73*9683Slinton %% 74*9683Slinton 75*9683Slinton input: 76*9683Slinton input command_nl 77*9683Slinton | 78*9683Slinton /* empty */ 79*9683Slinton ; 80*9683Slinton command_nl: 81*9683Slinton command_line '\n' 82*9683Slinton | 83*9683Slinton command_line ';' 84*9683Slinton | 85*9683Slinton '\n' 86*9683Slinton ; 87*9683Slinton 88*9683Slinton command_line: 89*9683Slinton command 90*9683Slinton { 91*9683Slinton if ($1 != nil) { 92*9683Slinton eval($1); 93*9683Slinton } 94*9683Slinton } 95*9683Slinton | 96*9683Slinton rcommand redirectout 97*9683Slinton { 98*9683Slinton if ($1 != nil) { 99*9683Slinton if ($2 != nil) { 100*9683Slinton setout($2); 101*9683Slinton eval($1); 102*9683Slinton unsetout(); 103*9683Slinton } else { 104*9683Slinton eval($1); 105*9683Slinton } 106*9683Slinton } 107*9683Slinton } 108*9683Slinton ; 109*9683Slinton redirectout: 110*9683Slinton '>' shellmode NAME 111*9683Slinton { 112*9683Slinton $$ = ident($3); 113*9683Slinton } 114*9683Slinton | 115*9683Slinton /* empty */ 116*9683Slinton { 117*9683Slinton $$ = nil; 118*9683Slinton } 119*9683Slinton ; 120*9683Slinton 121*9683Slinton /* 122*9683Slinton * Non-redirectable commands. 123*9683Slinton */ 124*9683Slinton command: 125*9683Slinton alias_command 126*9683Slinton { 127*9683Slinton $$ = $1; 128*9683Slinton } 129*9683Slinton | 130*9683Slinton ASSIGN term '=' exp 131*9683Slinton { 132*9683Slinton $$ = build(O_ASSIGN, $2, $4); 133*9683Slinton } 134*9683Slinton | 135*9683Slinton CATCH INT 136*9683Slinton { 137*9683Slinton $$ = build(O_CATCH, $2); 138*9683Slinton } 139*9683Slinton | 140*9683Slinton CONT 141*9683Slinton { 142*9683Slinton $$ = build(O_CONT); 143*9683Slinton } 144*9683Slinton | 145*9683Slinton DELETE INT 146*9683Slinton { 147*9683Slinton $$ = build(O_DELETE, $2); 148*9683Slinton } 149*9683Slinton | 150*9683Slinton EDIT shellmode opt_filename 151*9683Slinton { 152*9683Slinton $$ = build(O_EDIT, $3); 153*9683Slinton } 154*9683Slinton | 155*9683Slinton FILE shellmode opt_filename 156*9683Slinton { 157*9683Slinton $$ = build(O_CHFILE, $3); 158*9683Slinton } 159*9683Slinton | 160*9683Slinton FUNC 161*9683Slinton { 162*9683Slinton $$ = build(O_FUNC, nil); 163*9683Slinton } 164*9683Slinton | 165*9683Slinton FUNC symbol 166*9683Slinton { 167*9683Slinton $$ = build(O_FUNC, $2); 168*9683Slinton } 169*9683Slinton | 170*9683Slinton GRIPE 171*9683Slinton { 172*9683Slinton $$ = build(O_GRIPE); 173*9683Slinton } 174*9683Slinton | 175*9683Slinton HELP 176*9683Slinton { 177*9683Slinton $$ = build(O_HELP); 178*9683Slinton } 179*9683Slinton | 180*9683Slinton IGNORE INT 181*9683Slinton { 182*9683Slinton $$ = build(O_IGNORE, $2); 183*9683Slinton } 184*9683Slinton | 185*9683Slinton list_command 186*9683Slinton { 187*9683Slinton $$ = $1; 188*9683Slinton } 189*9683Slinton | 190*9683Slinton PSYM term 191*9683Slinton { 192*9683Slinton $$ = build(O_PSYM, $2); 193*9683Slinton } 194*9683Slinton | 195*9683Slinton QUIT 196*9683Slinton { 197*9683Slinton if (not popinput()) { 198*9683Slinton quit(0); 199*9683Slinton } else { 200*9683Slinton $$ = nil; 201*9683Slinton } 202*9683Slinton } 203*9683Slinton | 204*9683Slinton runcommand 205*9683Slinton { 206*9683Slinton run(); 207*9683Slinton /* NOTREACHED */ 208*9683Slinton } 209*9683Slinton | 210*9683Slinton SH 211*9683Slinton { 212*9683Slinton shellline(); 213*9683Slinton $$ = nil; 214*9683Slinton } 215*9683Slinton | 216*9683Slinton SOURCE shellmode filename 217*9683Slinton { 218*9683Slinton $$ = build(O_SOURCE, $3); 219*9683Slinton } 220*9683Slinton | 221*9683Slinton step 222*9683Slinton { 223*9683Slinton $$ = $1; 224*9683Slinton } 225*9683Slinton | 226*9683Slinton stop where opt_cond 227*9683Slinton { 228*9683Slinton $$ = build($1, nil, $2, $3); 229*9683Slinton } 230*9683Slinton | 231*9683Slinton stop what opt_cond 232*9683Slinton { 233*9683Slinton $$ = build($1, $2, nil, $3); 234*9683Slinton } 235*9683Slinton | 236*9683Slinton stop IF boolean_exp 237*9683Slinton { 238*9683Slinton $$ = build($1, nil, nil, $3); 239*9683Slinton } 240*9683Slinton | 241*9683Slinton trace what where opt_cond 242*9683Slinton { 243*9683Slinton $$ = build($1, $2, $3, $4); 244*9683Slinton } 245*9683Slinton | 246*9683Slinton trace where opt_cond 247*9683Slinton { 248*9683Slinton $$ = build($1, nil, $2, $3); 249*9683Slinton } 250*9683Slinton | 251*9683Slinton trace what opt_cond 252*9683Slinton { 253*9683Slinton $$ = build($1, $2, nil, $3); 254*9683Slinton } 255*9683Slinton | 256*9683Slinton trace opt_cond 257*9683Slinton { 258*9683Slinton $$ = build($1, nil, nil, $2); 259*9683Slinton } 260*9683Slinton | 261*9683Slinton WHATIS term 262*9683Slinton { 263*9683Slinton $$ = build(O_WHATIS, $2); 264*9683Slinton } 265*9683Slinton | 266*9683Slinton WHEN event '{' actions '}' 267*9683Slinton { 268*9683Slinton $$ = build(O_ADDEVENT, $2, $4); 269*9683Slinton } 270*9683Slinton | 271*9683Slinton WHEREIS symbol 272*9683Slinton { 273*9683Slinton $$ = build(O_WHEREIS, $2); 274*9683Slinton } 275*9683Slinton | 276*9683Slinton WHICH symbol 277*9683Slinton { 278*9683Slinton $$ = build(O_WHICH, $2); 279*9683Slinton } 280*9683Slinton | 281*9683Slinton USE shellmode sourcepath 282*9683Slinton { 283*9683Slinton $$ = nil; 284*9683Slinton if (list_size(sourcepath) == 0) { 285*9683Slinton list_append(list_item("."), nil, sourcepath); 286*9683Slinton } 287*9683Slinton } 288*9683Slinton ; 289*9683Slinton runcommand: 290*9683Slinton run shellmode arglist 291*9683Slinton ; 292*9683Slinton run: 293*9683Slinton RUN 294*9683Slinton { 295*9683Slinton fflush(stdout); 296*9683Slinton arginit(); 297*9683Slinton } 298*9683Slinton ; 299*9683Slinton arglist: 300*9683Slinton arglist arg 301*9683Slinton | 302*9683Slinton /* empty */ 303*9683Slinton ; 304*9683Slinton arg: 305*9683Slinton NAME 306*9683Slinton { 307*9683Slinton newarg(ident($1)); 308*9683Slinton } 309*9683Slinton | 310*9683Slinton '<' NAME 311*9683Slinton { 312*9683Slinton inarg(ident($2)); 313*9683Slinton } 314*9683Slinton | 315*9683Slinton '>' NAME 316*9683Slinton { 317*9683Slinton outarg(ident($2)); 318*9683Slinton } 319*9683Slinton ; 320*9683Slinton step: 321*9683Slinton STEP 322*9683Slinton { 323*9683Slinton $$ = build(O_STEP, true, false); 324*9683Slinton } 325*9683Slinton | 326*9683Slinton STEPI 327*9683Slinton { 328*9683Slinton $$ = build(O_STEP, false, false); 329*9683Slinton } 330*9683Slinton | 331*9683Slinton NEXT 332*9683Slinton { 333*9683Slinton $$ = build(O_STEP, true, true); 334*9683Slinton } 335*9683Slinton | 336*9683Slinton NEXTI 337*9683Slinton { 338*9683Slinton $$ = build(O_STEP, false, true); 339*9683Slinton } 340*9683Slinton ; 341*9683Slinton shellmode: 342*9683Slinton /* empty */ 343*9683Slinton { 344*9683Slinton beginshellmode(); 345*9683Slinton } 346*9683Slinton ; 347*9683Slinton sourcepath: 348*9683Slinton sourcepath NAME 349*9683Slinton { 350*9683Slinton list_append(list_item(ident($2)), nil, sourcepath); 351*9683Slinton } 352*9683Slinton | 353*9683Slinton /* empty */ 354*9683Slinton { 355*9683Slinton String dir; 356*9683Slinton 357*9683Slinton foreach (String, dir, sourcepath) 358*9683Slinton list_delete(list_curitem(sourcepath), sourcepath); 359*9683Slinton endfor 360*9683Slinton } 361*9683Slinton ; 362*9683Slinton event: 363*9683Slinton where 364*9683Slinton | 365*9683Slinton exp 366*9683Slinton ; 367*9683Slinton actions: 368*9683Slinton actions cmd ';' 369*9683Slinton { 370*9683Slinton $$ = $1; 371*9683Slinton cmdlist_append($2, $$); 372*9683Slinton } 373*9683Slinton | 374*9683Slinton cmd ';' 375*9683Slinton { 376*9683Slinton $$ = list_alloc(); 377*9683Slinton cmdlist_append($1, $$); 378*9683Slinton } 379*9683Slinton ; 380*9683Slinton cmd: 381*9683Slinton command 382*9683Slinton | 383*9683Slinton rcommand 384*9683Slinton ; 385*9683Slinton 386*9683Slinton /* 387*9683Slinton * Redirectable commands. 388*9683Slinton */ 389*9683Slinton rcommand: 390*9683Slinton PRINT exp_list 391*9683Slinton { 392*9683Slinton $$ = build(O_PRINT, $2); 393*9683Slinton } 394*9683Slinton | 395*9683Slinton WHERE 396*9683Slinton { 397*9683Slinton $$ = build(O_WHERE); 398*9683Slinton } 399*9683Slinton | 400*9683Slinton examine 401*9683Slinton { 402*9683Slinton $$ = $1; 403*9683Slinton } 404*9683Slinton | 405*9683Slinton CALL term 406*9683Slinton { 407*9683Slinton $$ = $2; 408*9683Slinton } 409*9683Slinton | 410*9683Slinton DUMP 411*9683Slinton { 412*9683Slinton $$ = build(O_DUMP); 413*9683Slinton } 414*9683Slinton | 415*9683Slinton STATUS 416*9683Slinton { 417*9683Slinton $$ = build(O_STATUS); 418*9683Slinton } 419*9683Slinton ; 420*9683Slinton alias_command: 421*9683Slinton ALIAS name name 422*9683Slinton { 423*9683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), build(O_NAME, $3)); 424*9683Slinton } 425*9683Slinton | 426*9683Slinton ALIAS name 427*9683Slinton { 428*9683Slinton $$ = build(O_ALIAS, build(O_NAME, $2), nil); 429*9683Slinton } 430*9683Slinton | 431*9683Slinton ALIAS 432*9683Slinton { 433*9683Slinton $$ = build(O_ALIAS, nil, nil); 434*9683Slinton } 435*9683Slinton ; 436*9683Slinton trace: 437*9683Slinton TRACE 438*9683Slinton { 439*9683Slinton $$ = O_TRACE; 440*9683Slinton } 441*9683Slinton | 442*9683Slinton TRACEI 443*9683Slinton { 444*9683Slinton $$ = O_TRACEI; 445*9683Slinton } 446*9683Slinton ; 447*9683Slinton stop: 448*9683Slinton STOP 449*9683Slinton { 450*9683Slinton $$ = O_STOP; 451*9683Slinton } 452*9683Slinton | 453*9683Slinton STOPI 454*9683Slinton { 455*9683Slinton $$ = O_STOPI; 456*9683Slinton } 457*9683Slinton ; 458*9683Slinton what: 459*9683Slinton exp 460*9683Slinton { 461*9683Slinton $$ = $1; 462*9683Slinton } 463*9683Slinton | 464*9683Slinton STRING ':' line_number 465*9683Slinton { 466*9683Slinton $$ = build(O_QLINE, build(O_SCON, $1), $3); 467*9683Slinton } 468*9683Slinton ; 469*9683Slinton where: 470*9683Slinton IN term 471*9683Slinton { 472*9683Slinton $$ = $2; 473*9683Slinton } 474*9683Slinton | 475*9683Slinton AT line_number 476*9683Slinton { 477*9683Slinton $$ = build(O_QLINE, build(O_SCON, cursource), $2); 478*9683Slinton } 479*9683Slinton | 480*9683Slinton AT STRING ':' line_number 481*9683Slinton { 482*9683Slinton $$ = build(O_QLINE, build(O_SCON, $2), $4); 483*9683Slinton } 484*9683Slinton ; 485*9683Slinton filename: 486*9683Slinton NAME 487*9683Slinton { 488*9683Slinton $$ = ident($1); 489*9683Slinton } 490*9683Slinton ; 491*9683Slinton opt_filename: 492*9683Slinton /* empty */ 493*9683Slinton { 494*9683Slinton $$ = nil; 495*9683Slinton } 496*9683Slinton | 497*9683Slinton filename 498*9683Slinton { 499*9683Slinton $$ = $1; 500*9683Slinton } 501*9683Slinton ; 502*9683Slinton opt_arglist: 503*9683Slinton /* empty */ 504*9683Slinton { 505*9683Slinton $$ = nil; 506*9683Slinton } 507*9683Slinton | 508*9683Slinton '(' exp_list ')' 509*9683Slinton { 510*9683Slinton $$ = $2; 511*9683Slinton } 512*9683Slinton ; 513*9683Slinton list_command: 514*9683Slinton LIST 515*9683Slinton { 516*9683Slinton $$ = build(O_LIST, 517*9683Slinton build(O_LCON, (long) cursrcline), 518*9683Slinton build(O_LCON, (long) cursrcline + 9) 519*9683Slinton ); 520*9683Slinton } 521*9683Slinton | 522*9683Slinton LIST line_number 523*9683Slinton { 524*9683Slinton $$ = build(O_LIST, $2, $2); 525*9683Slinton } 526*9683Slinton | 527*9683Slinton LIST line_number ',' line_number 528*9683Slinton { 529*9683Slinton $$ = build(O_LIST, $2, $4); 530*9683Slinton } 531*9683Slinton | 532*9683Slinton LIST symbol 533*9683Slinton { 534*9683Slinton $$ = build(O_LIST, $2); 535*9683Slinton } 536*9683Slinton ; 537*9683Slinton line_number: 538*9683Slinton INT 539*9683Slinton { 540*9683Slinton $$ = build(O_LCON, $1); 541*9683Slinton } 542*9683Slinton | 543*9683Slinton '$' 544*9683Slinton { 545*9683Slinton $$ = build(O_LCON, (long) LASTLINE); 546*9683Slinton } 547*9683Slinton ; 548*9683Slinton examine: 549*9683Slinton address '/' count mode 550*9683Slinton { 551*9683Slinton $$ = build(O_EXAMINE, $4, $1, nil, $3); 552*9683Slinton } 553*9683Slinton | 554*9683Slinton address ',' address '/' mode 555*9683Slinton { 556*9683Slinton $$ = build(O_EXAMINE, $5, $1, $3, 0); 557*9683Slinton } 558*9683Slinton | 559*9683Slinton '/' count mode 560*9683Slinton { 561*9683Slinton $$ = build(O_EXAMINE, $3, build(O_LCON, (long) prtaddr), nil, $2); 562*9683Slinton } 563*9683Slinton ; 564*9683Slinton address: 565*9683Slinton INT 566*9683Slinton { 567*9683Slinton $$ = build(O_LCON, $1); 568*9683Slinton } 569*9683Slinton | 570*9683Slinton '&' term 571*9683Slinton { 572*9683Slinton $$ = amper($2); 573*9683Slinton } 574*9683Slinton | 575*9683Slinton address '+' address 576*9683Slinton { 577*9683Slinton $$ = build(O_ADD, $1, $3); 578*9683Slinton } 579*9683Slinton | 580*9683Slinton address '-' address 581*9683Slinton { 582*9683Slinton $$ = build(O_SUB, $1, $3); 583*9683Slinton } 584*9683Slinton | 585*9683Slinton address '*' address 586*9683Slinton { 587*9683Slinton $$ = build(O_MUL, $1, $3); 588*9683Slinton } 589*9683Slinton | 590*9683Slinton '*' address %prec UNARYSIGN 591*9683Slinton { 592*9683Slinton $$ = build(O_INDIR, $2); 593*9683Slinton } 594*9683Slinton | 595*9683Slinton '(' exp ')' 596*9683Slinton { 597*9683Slinton $$ = $2; 598*9683Slinton } 599*9683Slinton ; 600*9683Slinton count: 601*9683Slinton /* empty */ 602*9683Slinton { 603*9683Slinton $$ = 1; 604*9683Slinton } 605*9683Slinton | 606*9683Slinton INT 607*9683Slinton { 608*9683Slinton $$ = $1; 609*9683Slinton } 610*9683Slinton ; 611*9683Slinton mode: 612*9683Slinton name 613*9683Slinton { 614*9683Slinton $$ = ident($1); 615*9683Slinton curformat = $$; 616*9683Slinton } 617*9683Slinton | 618*9683Slinton /* empty */ 619*9683Slinton { 620*9683Slinton $$ = curformat; 621*9683Slinton } 622*9683Slinton ; 623*9683Slinton opt_cond: 624*9683Slinton /* empty */ 625*9683Slinton { 626*9683Slinton $$ = nil; 627*9683Slinton } 628*9683Slinton | 629*9683Slinton IF boolean_exp 630*9683Slinton { 631*9683Slinton $$ = $2; 632*9683Slinton } 633*9683Slinton ; 634*9683Slinton exp_list: 635*9683Slinton exp 636*9683Slinton { 637*9683Slinton $$ = build(O_COMMA, $1, nil); 638*9683Slinton } 639*9683Slinton | 640*9683Slinton exp ',' exp_list 641*9683Slinton { 642*9683Slinton $$ = build(O_COMMA, $1, $3); 643*9683Slinton } 644*9683Slinton ; 645*9683Slinton exp: 646*9683Slinton term 647*9683Slinton { 648*9683Slinton $$ = build(O_RVAL, $1); 649*9683Slinton } 650*9683Slinton | 651*9683Slinton constant 652*9683Slinton { 653*9683Slinton $$ = $1; 654*9683Slinton } 655*9683Slinton | 656*9683Slinton '+' exp %prec UNARYSIGN 657*9683Slinton { 658*9683Slinton $$ = $2; 659*9683Slinton } 660*9683Slinton | 661*9683Slinton '-' exp %prec UNARYSIGN 662*9683Slinton { 663*9683Slinton $$ = build(O_NEG, $2); 664*9683Slinton } 665*9683Slinton | 666*9683Slinton '&' exp %prec UNARYSIGN 667*9683Slinton { 668*9683Slinton $$ = amper($2); 669*9683Slinton } 670*9683Slinton | 671*9683Slinton exp '+' exp 672*9683Slinton { 673*9683Slinton $$ = build(O_ADD, $1, $3); 674*9683Slinton } 675*9683Slinton | 676*9683Slinton exp '-' exp 677*9683Slinton { 678*9683Slinton $$ = build(O_SUB, $1, $3); 679*9683Slinton } 680*9683Slinton | 681*9683Slinton exp '*' exp 682*9683Slinton { 683*9683Slinton $$ = build(O_MUL, $1, $3); 684*9683Slinton } 685*9683Slinton | 686*9683Slinton exp '/' exp 687*9683Slinton { 688*9683Slinton $$ = build(O_DIVF, $1, $3); 689*9683Slinton } 690*9683Slinton | 691*9683Slinton exp DIV exp 692*9683Slinton { 693*9683Slinton $$ = build(O_DIV, $1, $3); 694*9683Slinton } 695*9683Slinton | 696*9683Slinton exp MOD exp 697*9683Slinton { 698*9683Slinton $$ = build(O_MOD, $1, $3); 699*9683Slinton } 700*9683Slinton | 701*9683Slinton exp AND exp 702*9683Slinton { 703*9683Slinton $$ = build(O_AND, $1, $3); 704*9683Slinton } 705*9683Slinton | 706*9683Slinton exp OR exp 707*9683Slinton { 708*9683Slinton $$ = build(O_OR, $1, $3); 709*9683Slinton } 710*9683Slinton | 711*9683Slinton exp '<' exp 712*9683Slinton { 713*9683Slinton $$ = build(O_LT, $1, $3); 714*9683Slinton } 715*9683Slinton | 716*9683Slinton exp '<' '=' exp 717*9683Slinton { 718*9683Slinton $$ = build(O_LE, $1, $4); 719*9683Slinton } 720*9683Slinton | 721*9683Slinton exp '>' exp 722*9683Slinton { 723*9683Slinton $$ = build(O_GT, $1, $3); 724*9683Slinton } 725*9683Slinton | 726*9683Slinton exp '>' '=' exp 727*9683Slinton { 728*9683Slinton $$ = build(O_GE, $1, $4); 729*9683Slinton } 730*9683Slinton | 731*9683Slinton exp '=' exp 732*9683Slinton { 733*9683Slinton $$ = build(O_EQ, $1, $3); 734*9683Slinton } 735*9683Slinton | 736*9683Slinton exp '=' '=' exp 737*9683Slinton { 738*9683Slinton $$ = build(O_EQ, $1, $4); 739*9683Slinton } 740*9683Slinton | 741*9683Slinton exp '<' '>' exp 742*9683Slinton { 743*9683Slinton $$ = build(O_NE, $1, $4); 744*9683Slinton } 745*9683Slinton | 746*9683Slinton exp '!' '=' exp 747*9683Slinton { 748*9683Slinton $$ = build(O_NE, $1, $4); 749*9683Slinton } 750*9683Slinton | 751*9683Slinton '(' exp ')' 752*9683Slinton { 753*9683Slinton $$ = $2; 754*9683Slinton } 755*9683Slinton ; 756*9683Slinton term: 757*9683Slinton symbol 758*9683Slinton { 759*9683Slinton $$ = $1; 760*9683Slinton } 761*9683Slinton | 762*9683Slinton term '[' exp_list ']' 763*9683Slinton { 764*9683Slinton $$ = subscript($1, $3); 765*9683Slinton } 766*9683Slinton | 767*9683Slinton term '.' name 768*9683Slinton { 769*9683Slinton $$ = dot($1, $3); 770*9683Slinton } 771*9683Slinton | 772*9683Slinton term ARROW name 773*9683Slinton { 774*9683Slinton $$ = dot($1, $3); 775*9683Slinton } 776*9683Slinton | 777*9683Slinton '*' term %prec UNARYSIGN 778*9683Slinton { 779*9683Slinton $$ = build(O_INDIR, $2); 780*9683Slinton } 781*9683Slinton | 782*9683Slinton '*' '(' exp ')' %prec UNARYSIGN 783*9683Slinton { 784*9683Slinton $$ = build(O_INDIR, $3); 785*9683Slinton } 786*9683Slinton | 787*9683Slinton term '^' %prec UNARYSIGN 788*9683Slinton { 789*9683Slinton $$ = build(O_INDIR, $1); 790*9683Slinton } 791*9683Slinton | 792*9683Slinton '#' term %prec UNARYSIGN 793*9683Slinton { 794*9683Slinton $$ = concrete($2); 795*9683Slinton } 796*9683Slinton | 797*9683Slinton term '(' exp_list ')' 798*9683Slinton { 799*9683Slinton $$ = build(O_CALL, $1, $3); 800*9683Slinton } 801*9683Slinton ; 802*9683Slinton boolean_exp: 803*9683Slinton exp 804*9683Slinton { 805*9683Slinton chkboolean($1); 806*9683Slinton $$ = $1; 807*9683Slinton } 808*9683Slinton ; 809*9683Slinton constant: 810*9683Slinton INT 811*9683Slinton { 812*9683Slinton $$ = build(O_LCON, $1); 813*9683Slinton } 814*9683Slinton | 815*9683Slinton REAL 816*9683Slinton { 817*9683Slinton $$ = build(O_FCON, $1); 818*9683Slinton } 819*9683Slinton | 820*9683Slinton STRING 821*9683Slinton { 822*9683Slinton $$ = build(O_SCON, $1); 823*9683Slinton } 824*9683Slinton ; 825*9683Slinton symbol: 826*9683Slinton name 827*9683Slinton { 828*9683Slinton $$ = build(O_SYM, which($1)); 829*9683Slinton } 830*9683Slinton ; 831*9683Slinton name: 832*9683Slinton NAME 833*9683Slinton { 834*9683Slinton $$ = $1; 835*9683Slinton } 836*9683Slinton | 837*9683Slinton keyword 838*9683Slinton { 839*9683Slinton $$ = $1; 840*9683Slinton } 841*9683Slinton keyword: 842*9683Slinton ALIAS | AND | ASSIGN | AT | CALL | CATCH | CONT | DELETE | DIV | DUMP | 843*9683Slinton EDIT | FILE | FUNC | GRIPE | HELP | IGNORE | IN | LIST | MOD | 844*9683Slinton NEXT | NEXTI | NIL | NOT | OR | PRINT | PSYM | QUIT | RUN | 845*9683Slinton SH | SKIP | SOURCE | STATUS | STEP | STEPI | 846*9683Slinton STOP | STOPI | TRACE | TRACEI | 847*9683Slinton USE | WHATIS | WHEN | WHERE | WHICH 848*9683Slinton ; 849