1 /* 2 * A n t l r T r a n s l a t i o n H e a d e r 3 * 4 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001 5 * Purdue University Electrical Engineering 6 * With AHPCRC, University of Minnesota 7 * ANTLR Version 1.33MR33 8 * 9 * ..\bin\antlr -gh antlr.g 10 * 11 */ 12 13 #define ANTLR_VERSION 13333 14 #include "pcctscfg.h" 15 #include "pccts_stdio.h" 16 17 #include "pcctscfg.h" 18 #include "set.h" 19 #include <ctype.h> 20 #include "syn.h" 21 #include "hash.h" 22 #include "generic.h" 23 #define zzcr_attr(attr,tok,t) 24 #define zzSET_SIZE 20 25 #include "antlr.h" 26 #include "tokens.h" 27 #include "dlgdef.h" 28 #include "mode.h" 29 30 /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */ 31 32 #ifndef PCCTS_PURIFY 33 #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s)); 34 #endif 35 36 ANTLR_INFO 37 38 39 /* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */ 40 #if defined(__TURBOC__) 41 #pragma warn -aus /* unused assignment of 'xxx' */ 42 #endif 43 44 45 #ifdef __USE_PROTOS 46 static void chkToken(char *, char *, char *, int); 47 #else 48 static void chkToken(); 49 #endif 50 51 #ifdef __USE_PROTOS 52 static int isDLGmaxToken(char *Token); /* MR3 */ 53 #else 54 static int isDLGmaxToken(); /* MR3 */ 55 #endif 56 57 static int class_nest_level = 0; 58 59 /* MR20 G. Hobbelt extern definitions moved to antlr.h */ 60 61 62 63 void 64 #ifdef __USE_PROTOS 65 grammar(void) 66 #else 67 grammar() 68 #endif 69 { 70 zzRULE; 71 zzBLOCK(zztasp1); 72 zzMake0; 73 { 74 Graph g; 75 { 76 zzBLOCK(zztasp2); 77 zzMake0; 78 { 79 for (;;) { 80 if ( !((setwd1[LA(1)]&0x1))) break; 81 if ( (LA(1)==94) ) { 82 zzmatch(94); zzCONSUME; 83 zzmatch(Action); 84 85 if ( HdrAction==NULL ) { 86 HdrAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 87 require(HdrAction!=NULL, "rule grammar: cannot allocate header action"); 88 strcpy(HdrAction, LATEXT(1)); 89 } 90 else warn("additional #header statement ignored"); 91 zzCONSUME; 92 93 } 94 else { 95 if ( (LA(1)==95) ) { 96 zzmatch(95); zzCONSUME; 97 zzmatch(Action); 98 99 if ( FirstAction==NULL ) { 100 FirstAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 101 require(FirstAction!=NULL, "rule grammar: cannot allocate #first action"); 102 strcpy(FirstAction, LATEXT(1)); 103 } else { 104 warn("additional #first statement ignored"); 105 }; 106 zzCONSUME; 107 108 } 109 else { 110 if ( (LA(1)==96) ) { 111 zzmatch(96); zzCONSUME; 112 zzmatch(QuotedTerm); 113 114 if ( GenCC ) { 115 warn("#parser meta-op incompatible with -CC; ignored"); 116 } 117 else { 118 if ( strcmp(ParserName,"zzparser")==0 ) { 119 ParserName=StripQuotes(mystrdup(LATEXT(1))); 120 if ( RulePrefix[0]!='\0' ) 121 { 122 warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored"); 123 RulePrefix[0]='\0'; 124 } 125 } 126 else warn("additional #parser statement ignored"); 127 } 128 zzCONSUME; 129 130 } 131 else { 132 if ( (LA(1)==97) ) { 133 zzmatch(97); zzCONSUME; 134 zzmatch(QuotedTerm); 135 { 136 char *fname; 137 zzantlr_state st; FILE *f; struct zzdlg_state dst; 138 UserTokenDefsFile = mystrdup(LATEXT(1)); 139 zzsave_antlr_state(&st); 140 zzsave_dlg_state(&dst); 141 fname = mystrdup(LATEXT(1)); 142 f = fopen(StripQuotes(fname), "r"); 143 if ( f==NULL ) {warn(eMsg1("cannot open token defs file '%s'", fname+1));} 144 else { 145 ANTLRm(enum_file(fname+1), f, PARSE_ENUM_FILE); 146 UserDefdTokens = 1; 147 } 148 zzrestore_antlr_state(&st); 149 zzrestore_dlg_state(&dst); 150 } 151 zzCONSUME; 152 153 } 154 else break; /* MR6 code for exiting loop "for sure" */ 155 } 156 } 157 } 158 zzLOOP(zztasp2); 159 } 160 zzEXIT(zztasp2); 161 } 162 } 163 { 164 zzBLOCK(zztasp2); 165 zzMake0; 166 { 167 for (;;) { 168 if ( !((setwd1[LA(1)]&0x2))) break; 169 if ( (LA(1)==Action) ) { 170 zzmatch(Action); 171 { 172 UserAction *ua = newUserAction(LATEXT(1)); 173 ua->file = action_file; ua->line = action_line; 174 if ( class_nest_level>0 ) list_add(&class_before_actions, ua); 175 else list_add(&BeforeActions, ua); 176 } 177 zzCONSUME; 178 179 } 180 else { 181 if ( (LA(1)==108) ) { 182 laction(); 183 } 184 else { 185 if ( (LA(1)==109) ) { 186 lmember(); 187 } 188 else { 189 if ( (LA(1)==110) ) { 190 lprefix(); 191 } 192 else { 193 if ( (LA(1)==116) ) { 194 aLexclass(); 195 } 196 else { 197 if ( (LA(1)==120) ) { 198 token(); 199 } 200 else { 201 if ( (LA(1)==117) ) { 202 error(); 203 } 204 else { 205 if ( (LA(1)==118) ) { 206 tclass(); 207 } 208 else { 209 if ( (LA(1)==111) ) { 210 aPred(); 211 } 212 else { 213 if ( (LA(1)==133) ) { 214 default_exception_handler(); 215 } 216 else { 217 if ( (LA(1)==99) ) { 218 class_def(); 219 } 220 else { 221 if ( (LA(1)==98) ) { 222 zzmatch(98); 223 224 if ( class_nest_level==0 ) 225 warn("missing class definition for trailing '}'"); 226 class_nest_level--; 227 zzCONSUME; 228 229 } 230 else break; /* MR6 code for exiting loop "for sure" */ 231 } 232 } 233 } 234 } 235 } 236 } 237 } 238 } 239 } 240 } 241 } 242 zzLOOP(zztasp2); 243 } 244 zzEXIT(zztasp2); 245 } 246 } 247 rule(); 248 g=zzaArg(zztasp1,3); SynDiag = (Junction *) zzaArg(zztasp1,3 ).left; 249 { 250 zzBLOCK(zztasp2); 251 zzMake0; 252 { 253 for (;;) { 254 if ( !((setwd1[LA(1)]&0x4))) break; 255 if ( (LA(1)==NonTerminal) ) { 256 rule(); 257 if ( zzaArg(zztasp2,1 ).left!=NULL ) { 258 g.right = NULL; 259 260 /* MR21a */ /* Avoid use of a malformed graph when CannotContinue */ 261 /* MR21a */ /* is already set */ 262 /* MR21a */ 263 /* MR21a */ if (! (CannotContinue && g.left == NULL)) { 264 /* MR21a */ g = Or(g, zzaArg(zztasp2,1)); 265 /* MR21a */ } 266 /* MR21a */ } 267 } 268 else { 269 if ( (LA(1)==116) ) { 270 aLexclass(); 271 } 272 else { 273 if ( (LA(1)==120) ) { 274 token(); 275 } 276 else { 277 if ( (LA(1)==117) ) { 278 error(); 279 } 280 else { 281 if ( (LA(1)==118) ) { 282 tclass(); 283 } 284 else { 285 if ( (LA(1)==111) ) { 286 aPred(); 287 } 288 else { 289 if ( (LA(1)==99) ) { 290 class_def(); 291 } 292 else { 293 if ( (LA(1)==98) ) { 294 zzmatch(98); 295 296 if ( class_nest_level==0 ) 297 warn("missing class definition for trailing '}'"); 298 class_nest_level--; 299 zzCONSUME; 300 301 } 302 else break; /* MR6 code for exiting loop "for sure" */ 303 } 304 } 305 } 306 } 307 } 308 } 309 } 310 zzLOOP(zztasp2); 311 } 312 zzEXIT(zztasp2); 313 } 314 } 315 { 316 zzBLOCK(zztasp2); 317 zzMake0; 318 { 319 for (;;) { 320 if ( !((setwd1[LA(1)]&0x8))) break; 321 if ( (LA(1)==Action) ) { 322 zzmatch(Action); 323 { 324 UserAction *ua = newUserAction(LATEXT(1)); 325 ua->file = action_file; ua->line = action_line; 326 if ( class_nest_level>0 ) list_add(&class_after_actions, ua); 327 else list_add(&AfterActions, ua); 328 } 329 zzCONSUME; 330 331 } 332 else { 333 if ( (LA(1)==108) ) { 334 laction(); 335 } 336 else { 337 if ( (LA(1)==109) ) { 338 lmember(); 339 } 340 else { 341 if ( (LA(1)==110) ) { 342 lprefix(); 343 } 344 else { 345 if ( (LA(1)==117) ) { 346 error(); 347 } 348 else { 349 if ( (LA(1)==118) ) { 350 tclass(); 351 } 352 else { 353 if ( (LA(1)==99) ) { 354 class_def(); 355 } 356 else { 357 if ( (LA(1)==111) ) { 358 aPred(); 359 } 360 else { 361 if ( (LA(1)==98) ) { 362 zzmatch(98); 363 364 if ( class_nest_level==0 ) 365 warn("missing class definition for trailing '}'"); 366 class_nest_level--; 367 zzCONSUME; 368 369 } 370 else break; /* MR6 code for exiting loop "for sure" */ 371 } 372 } 373 } 374 } 375 } 376 } 377 } 378 } 379 zzLOOP(zztasp2); 380 } 381 zzEXIT(zztasp2); 382 } 383 } 384 zzmatch(Eof); zzCONSUME; 385 zzEXIT(zztasp1); 386 return; 387 fail: 388 zzEXIT(zztasp1); 389 CannotContinue=TRUE; 390 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 391 zzresynch(setwd1, 0x10); 392 } 393 } 394 395 void 396 #ifdef __USE_PROTOS 397 class_def(void) 398 #else 399 class_def() 400 #endif 401 { 402 zzRULE; 403 zzBLOCK(zztasp1); 404 zzMake0; 405 { 406 int go=1; char name[MaxRuleName+1]; 407 zzmatch(99); zzCONSUME; 408 { 409 zzBLOCK(zztasp2); 410 zzMake0; 411 { 412 if ( (LA(1)==NonTerminal) ) { 413 zzmatch(NonTerminal); 414 if(go) strncpy(name,LATEXT(1),MaxRuleName); 415 zzCONSUME; 416 417 } 418 else { 419 if ( (LA(1)==TokenTerm) ) { 420 zzmatch(TokenTerm); 421 if(go) strncpy(name,LATEXT(1),MaxRuleName); 422 zzCONSUME; 423 424 } 425 else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 426 } 427 zzEXIT(zztasp2); 428 } 429 } 430 431 if ( CurrentClassName[0]!='\0' && strcmp(CurrentClassName,name)!=0 432 && GenCC ) { 433 err("only one grammar class allowed in this release"); 434 go = 0; 435 } 436 else strcpy(CurrentClassName, name); 437 if ( !GenCC ) { err("class meta-op used without C++ option"); } 438 { 439 zzBLOCK(zztasp2); 440 zzMake0; 441 { 442 while ( (setwd1[LA(1)]&0x20) ) { 443 zzsetmatch(zzerr2, zzerr3); 444 if (ClassDeclStuff == NULL) { 445 /* MR10 */ ClassDeclStuff=(char *)calloc(MaxClassDeclStuff+1,sizeof(char)); 446 /* MR10 */ }; 447 /* MR10 */ strncat(ClassDeclStuff," ",MaxClassDeclStuff); 448 /* MR10 */ strncat(ClassDeclStuff,LATEXT(1),MaxClassDeclStuff); 449 /* MR22 */ do { 450 /* MR22 */ if (0 == strcmp(LATEXT(1),"public")) break; 451 /* MR22 */ if (0 == strcmp(LATEXT(1),"private")) break; 452 /* MR22 */ if (0 == strcmp(LATEXT(1),"protected")) break; 453 /* MR22 */ if (0 == strcmp(LATEXT(1),"virtual")) break; 454 /* MR22 */ if (0 == strcmp(LATEXT(1),",")) break; 455 /* MR22 */ if (0 == strcmp(LATEXT(1),":")) break; 456 /* MR22 */ if (BaseClassName != NULL) break; 457 /* MR22 */ BaseClassName=(char *)calloc(strlen(LATEXT(1))+1,sizeof(char)); 458 /* MR22 */ require(BaseClassName!=NULL, "rule grammar: cannot allocate base class name"); 459 /* MR22 */ strcpy(BaseClassName,LATEXT(1)); 460 /* MR22 */ } while (0); 461 /* MR10 */ 462 zzCONSUME; 463 464 zzLOOP(zztasp2); 465 } 466 zzEXIT(zztasp2); 467 } 468 } 469 zzmatch(102); 470 471 no_classes_found = 0; 472 if ( class_nest_level>=1 ) {warn("cannot have nested classes");} 473 else class_nest_level++; 474 zzCONSUME; 475 476 zzEXIT(zztasp1); 477 return; 478 fail: 479 zzEXIT(zztasp1); 480 CannotContinue=TRUE; 481 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 482 zzresynch(setwd1, 0x40); 483 } 484 } 485 486 void 487 #ifdef __USE_PROTOS 488 rule(void) 489 #else 490 rule() 491 #endif 492 { 493 zzRULE; 494 zzBLOCK(zztasp1); 495 zzMake0; 496 { 497 498 499 ExceptionGroup *eg; 500 RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e; 501 set toksrefd, rulesrefd; 502 char *pdecl=NULL, *ret=NULL, *a; CurRetDef = CurParmDef = NULL; 503 CurExGroups = NULL; 504 CurElementLabels = NULL; 505 CurAstLabelsInActions = NULL; /* MR27 */ 506 /* We want a new element label hash table for each rule */ 507 if ( Elabel!=NULL ) killHashTable(Elabel); 508 Elabel = newHashTable(); 509 attribsRefdFromAction = empty; 510 zzmatch(NonTerminal); 511 q=NULL; 512 if ( hash_get(Rname, LATEXT(1))!=NULL ) { 513 err(eMsg1("duplicate rule definition: '%s'",LATEXT(1))); 514 CannotContinue=TRUE; 515 } 516 else 517 { 518 q = (RuleEntry *)hash_add(Rname, 519 LATEXT(1), 520 (Entry *)newRuleEntry(LATEXT(1))); 521 CurRule = q->str; 522 } 523 CurRuleNode = q; 524 f = CurFile; l = zzline; 525 NumRules++; 526 zzCONSUME; 527 528 { 529 zzBLOCK(zztasp2); 530 zzMake0; 531 { 532 if ( (LA(1)==103) ) { 533 zzmatch(103); 534 if ( q!=NULL ) q->noAST = TRUE; 535 zzCONSUME; 536 537 } 538 else { 539 if ( (setwd1[LA(1)]&0x80) ) { 540 } 541 else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 542 } 543 zzEXIT(zztasp2); 544 } 545 } 546 { 547 zzBLOCK(zztasp2); 548 zzMake0; 549 { 550 ; 551 if ( (setwd2[LA(1)]&0x1) ) { 552 { 553 zzBLOCK(zztasp3); 554 zzMake0; 555 { 556 if ( (LA(1)==104) ) { 557 zzmatch(104); zzCONSUME; 558 } 559 else { 560 if ( (LA(1)==PassAction) ) { 561 } 562 else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 563 } 564 zzEXIT(zztasp3); 565 } 566 } 567 zzmatch(PassAction); 568 pdecl = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 569 require(pdecl!=NULL, "rule rule: cannot allocate param decl"); 570 strcpy(pdecl, LATEXT(1)); 571 CurParmDef = pdecl; 572 zzCONSUME; 573 574 } 575 else { 576 if ( (setwd2[LA(1)]&0x2) ) { 577 } 578 else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 579 } 580 zzEXIT(zztasp2); 581 } 582 } 583 { 584 zzBLOCK(zztasp2); 585 zzMake0; 586 { 587 if ( (LA(1)==105) ) { 588 zzmatch(105); zzCONSUME; 589 zzmatch(PassAction); 590 ret = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 591 require(ret!=NULL, "rule rule: cannot allocate ret type"); 592 strcpy(ret, LATEXT(1)); 593 CurRetDef = ret; 594 zzCONSUME; 595 596 } 597 else { 598 if ( (setwd2[LA(1)]&0x4) ) { 599 } 600 else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 601 } 602 zzEXIT(zztasp2); 603 } 604 } 605 { 606 zzBLOCK(zztasp2); 607 zzMake0; 608 { 609 if ( (LA(1)==QuotedTerm) ) { 610 zzmatch(QuotedTerm); 611 if ( q!=NULL ) q->egroup=mystrdup(LATEXT(1)); 612 zzCONSUME; 613 614 } 615 else { 616 if ( (LA(1)==106) ) { 617 } 618 else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 619 } 620 zzEXIT(zztasp2); 621 } 622 } 623 624 if ( GenEClasseForRules && q!=NULL ) { 625 e = newECnode; 626 require(e!=NULL, "cannot allocate error class node"); 627 if ( q->egroup == NULL ) {a = q->str; a[0] = (char)toupper(a[0]);} 628 else a = q->egroup; 629 if ( Tnum( a ) == 0 ) 630 { 631 e->tok = addTname( a ); 632 list_add(&eclasses, (char *)e); 633 if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); 634 /* refers to itself */ 635 list_add(&(e->elist), mystrdup(q->str)); 636 } 637 else { 638 warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a)); 639 if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]); 640 free((char *)e); 641 } 642 } 643 BlkLevel++; 644 if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); 645 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; 646 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; 647 zzmatch(106); 648 inAlt=1; 649 zzCONSUME; 650 651 block( &toksrefd, &rulesrefd ); 652 r = makeBlk(zzaArg(zztasp1,7),0, NULL /* pFirstSetSymbol */ ); 653 CurRuleBlk = (Junction *)r.left; 654 CurRuleBlk->blockid = CurBlockID; 655 CurRuleBlk->jtype = RuleBlk; 656 if ( q!=NULL ) CurRuleBlk->rname = q->str; 657 CurRuleBlk->file = f; 658 CurRuleBlk->line = l; 659 CurRuleBlk->pdecl = pdecl; 660 CurRuleBlk->ret = ret; 661 CurRuleBlk->lock = makelocks(); 662 CurRuleBlk->pred_lock = makelocks(); 663 CurRuleBlk->tokrefs = toksrefd; 664 CurRuleBlk->rulerefs = rulesrefd; 665 p = newJunction(); /* add EndRule Node */ 666 ((Junction *)r.right)->p1 = (Node *)p; 667 r.right = (Node *) p; 668 p->jtype = EndRule; 669 p->lock = makelocks(); 670 p->pred_lock = makelocks(); 671 CurRuleBlk->end = p; 672 if ( q!=NULL ) q->rulenum = NumRules; 673 zzaArg(zztasp1,7) = r; 674 675 /* MR23 */ CurBlockID_array[BlkLevel] = (-1); 676 /* MR23 */ CurAltNum_array[BlkLevel] = (-1); 677 --BlkLevel; 678 altFixup();leFixup();egFixup(); 679 zzmatch(107); 680 inAlt=0; 681 zzCONSUME; 682 683 { 684 zzBLOCK(zztasp2); 685 zzMake0; 686 { 687 if ( (LA(1)==Action) ) { 688 zzmatch(Action); 689 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 690 require(a!=NULL, "rule rule: cannot allocate error action"); 691 strcpy(a, LATEXT(1)); 692 CurRuleBlk->erraction = a; 693 zzCONSUME; 694 695 } 696 else { 697 if ( (setwd2[LA(1)]&0x8) ) { 698 } 699 else {zzFAIL(1,zzerr9,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 700 } 701 zzEXIT(zztasp2); 702 } 703 } 704 { 705 zzBLOCK(zztasp2); 706 zzMake0; 707 { 708 while ( (LA(1)==133) ) { 709 eg = exception_group(); 710 711 if ( eg!=NULL ) { 712 list_add(&CurExGroups, (void *)eg); 713 if (eg->label == NULL || *eg->label=='\0' ) q->has_rule_exception = 1; 714 } 715 zzLOOP(zztasp2); 716 } 717 zzEXIT(zztasp2); 718 } 719 } 720 if ( q==NULL ) zzaArg(zztasp1,0 ).left = NULL; else zzaArg(zztasp1,0) = zzaArg(zztasp1,7); 721 CurRuleBlk->exceptions = CurExGroups; 722 CurRuleBlk->el_labels = CurElementLabels; 723 CurRuleNode->ast_labels_in_actions = CurAstLabelsInActions; 724 CurRuleNode = NULL; 725 zzEXIT(zztasp1); 726 return; 727 fail: 728 zzEXIT(zztasp1); 729 CannotContinue=TRUE; 730 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 731 zzresynch(setwd2, 0x10); 732 } 733 } 734 735 void 736 #ifdef __USE_PROTOS 737 laction(void) 738 #else 739 laction() 740 #endif 741 { 742 zzRULE; 743 zzBLOCK(zztasp1); 744 zzMake0; 745 { 746 char *a; 747 zzmatch(108); zzCONSUME; 748 zzmatch(Action); 749 750 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 751 require(a!=NULL, "rule laction: cannot allocate action"); 752 strcpy(a, LATEXT(1)); 753 list_add(&LexActions, a); 754 zzCONSUME; 755 756 zzEXIT(zztasp1); 757 return; 758 fail: 759 zzEXIT(zztasp1); 760 CannotContinue=TRUE; 761 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 762 zzresynch(setwd2, 0x20); 763 } 764 } 765 766 void 767 #ifdef __USE_PROTOS 768 lmember(void) 769 #else 770 lmember() 771 #endif 772 { 773 zzRULE; 774 zzBLOCK(zztasp1); 775 zzMake0; 776 { 777 char *a; 778 zzmatch(109); zzCONSUME; 779 zzmatch(Action); 780 781 /* MR1 */ if (! GenCC) { 782 /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header"); 783 /* MR1 */ } else { 784 /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 785 /* MR1 */ require(a!=NULL, "rule lmember: cannot allocate action"); 786 /* MR1 */ strcpy(a, LATEXT(1)); 787 /* MR1 */ list_add(&LexMemberActions, a); 788 /* MR1 */ }; 789 /* MR1 */ 790 zzCONSUME; 791 792 zzEXIT(zztasp1); 793 return; 794 fail: 795 zzEXIT(zztasp1); 796 CannotContinue=TRUE; 797 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 798 zzresynch(setwd2, 0x40); 799 } 800 } 801 802 void 803 #ifdef __USE_PROTOS 804 lprefix(void) 805 #else 806 lprefix() 807 #endif 808 { 809 zzRULE; 810 zzBLOCK(zztasp1); 811 zzMake0; 812 { 813 char *a; 814 zzmatch(110); zzCONSUME; 815 zzmatch(Action); 816 817 /* MR1 */ if (! GenCC) { 818 /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header"); 819 /* MR1 */ } else { 820 /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 821 /* MR1 */ require(a!=NULL, "rule lprefix: cannot allocate action"); 822 /* MR1 */ strcpy(a, LATEXT(1)); 823 /* MR1 */ list_add(&LexPrefixActions, a); 824 /* MR1 */ }; 825 /* MR1 */ 826 zzCONSUME; 827 828 zzEXIT(zztasp1); 829 return; 830 fail: 831 zzEXIT(zztasp1); 832 CannotContinue=TRUE; 833 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 834 zzresynch(setwd2, 0x80); 835 } 836 } 837 838 void 839 #ifdef __USE_PROTOS 840 aPred(void) 841 #else 842 aPred() 843 #endif 844 { 845 zzRULE; 846 zzBLOCK(zztasp1); 847 zzMake0; 848 { 849 PredEntry *predEntry=NULL; 850 char *name=NULL; 851 Predicate *predExpr=NULL; 852 char *predLiteral=NULL; 853 int save_file; 854 int save_line; 855 int predExprPresent=0; 856 zzmatch(111); 857 858 MR_usingPredNames=1; /* will need to use -mrhoist version of genPredTree */ 859 zzCONSUME; 860 861 zzmatch(TokenTerm); 862 name=mystrdup(LATEXT(1)); 863 zzCONSUME; 864 865 866 /* don't free - referenced in predicates */ 867 868 CurPredName=(char *)calloc(1,strlen(name) + 10); 869 strcat(CurPredName,"#pred "); 870 strcat(CurPredName,name); 871 872 predEntry=(PredEntry *) hash_get(Pname,name); 873 if (predEntry != NULL) { 874 warnFL(eMsg1("#pred %s previously defined - ignored",name), 875 FileStr[action_file],action_line); 876 name=NULL; 877 }; 878 { 879 zzBLOCK(zztasp2); 880 zzMake0; 881 { 882 if ( (LA(1)==Pred) ) { 883 zzmatch(Pred); 884 predLiteral=mystrdup(LATEXT(1)); 885 save_line=action_line; 886 save_file=action_file; 887 zzCONSUME; 888 889 { 890 zzBLOCK(zztasp3); 891 zzMake0; 892 { 893 if ( (setwd3[LA(1)]&0x1) ) { 894 predExpr = predOrExpr(); 895 896 predExprPresent=1; 897 } 898 else { 899 if ( (setwd3[LA(1)]&0x2) ) { 900 } 901 else {zzFAIL(1,zzerr10,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 902 } 903 zzEXIT(zztasp3); 904 } 905 } 906 if (predLiteral != NULL && name != NULL) { 907 908 /* 909 * predExpr may be NULL due to syntax errors 910 * or simply omitted by the user 911 */ 912 913 predEntry=newPredEntry(name); 914 predEntry->file=save_file; 915 predEntry->line=save_line; 916 predExpr=MR_predFlatten(predExpr); 917 predEntry->predLiteral=predLiteral; 918 if (! predExprPresent || predExpr == NULL) { 919 predExpr=new_pred(); 920 predExpr->expr=predLiteral; 921 predExpr->source=newActionNode(); 922 predExpr->source->action=predExpr->expr; 923 predExpr->source->rname=CurPredName; 924 predExpr->source->line=action_line; 925 predExpr->source->file=action_file; 926 predExpr->source->is_predicate=1; 927 predExpr->k=predicateLookaheadDepth(predExpr->source); 928 }; 929 predEntry->pred=predExpr; 930 hash_add(Pname,name,(Entry *)predEntry); 931 predExpr=NULL; 932 }; 933 predicate_free(predExpr); 934 } 935 else { 936 if ( (setwd3[LA(1)]&0x4) ) { 937 save_line=zzline; save_file=CurFile; 938 predExpr = predOrExpr(); 939 940 if (predExpr != NULL && name != NULL) { 941 predEntry=newPredEntry(name); 942 predEntry->file=CurFile; 943 predEntry->line=zzline; 944 predExpr=MR_predFlatten(predExpr); 945 predEntry->pred=predExpr; 946 hash_add(Pname,name,(Entry *)predEntry); 947 predExpr=NULL; 948 }; 949 predicate_free(predExpr); 950 } 951 else {zzFAIL(1,zzerr11,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 952 } 953 zzEXIT(zztasp2); 954 } 955 } 956 { 957 zzBLOCK(zztasp2); 958 zzMake0; 959 { 960 if ( (LA(1)==107) ) { 961 zzmatch(107); zzCONSUME; 962 } 963 else { 964 if ( (setwd3[LA(1)]&0x8) ) { 965 } 966 else {zzFAIL(1,zzerr12,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 967 } 968 zzEXIT(zztasp2); 969 } 970 } 971 zzEXIT(zztasp1); 972 return; 973 fail: 974 zzEXIT(zztasp1); 975 predicate_free(predExpr); 976 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 977 zzresynch(setwd3, 0x10); 978 } 979 } 980 981 Predicate * 982 #ifdef __USE_PROTOS 983 predOrExpr(void) 984 #else 985 predOrExpr() 986 #endif 987 { 988 Predicate * _retv; 989 zzRULE; 990 zzBLOCK(zztasp1); 991 PCCTS_PURIFY(_retv,sizeof(Predicate * )) 992 zzMake0; 993 { 994 Predicate *ORnode; 995 Predicate *predExpr; 996 Predicate **tail=NULL; 997 predExpr = predAndExpr(); 998 999 1000 ORnode=new_pred(); 1001 ORnode->expr=PRED_OR_LIST; 1002 if (predExpr != NULL) { 1003 ORnode->down=predExpr; 1004 tail=&predExpr->right; 1005 }; 1006 { 1007 zzBLOCK(zztasp2); 1008 zzMake0; 1009 { 1010 while ( (LA(1)==112) ) { 1011 zzmatch(112); zzCONSUME; 1012 predExpr = predAndExpr(); 1013 1014 1015 if (predExpr != NULL) { 1016 *tail=predExpr; 1017 tail=&predExpr->right; 1018 }; 1019 zzLOOP(zztasp2); 1020 } 1021 zzEXIT(zztasp2); 1022 } 1023 } 1024 1025 _retv=ORnode; 1026 ORnode=NULL; 1027 zzEXIT(zztasp1); 1028 return _retv; 1029 fail: 1030 zzEXIT(zztasp1); 1031 predicate_free(ORnode); 1032 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1033 zzresynch(setwd3, 0x20); 1034 return _retv; 1035 } 1036 } 1037 1038 Predicate * 1039 #ifdef __USE_PROTOS 1040 predAndExpr(void) 1041 #else 1042 predAndExpr() 1043 #endif 1044 { 1045 Predicate * _retv; 1046 zzRULE; 1047 zzBLOCK(zztasp1); 1048 PCCTS_PURIFY(_retv,sizeof(Predicate * )) 1049 zzMake0; 1050 { 1051 Predicate *ANDnode; 1052 Predicate *predExpr; 1053 Predicate **tail=NULL; 1054 predExpr = predPrimary(); 1055 1056 1057 ANDnode=new_pred(); 1058 ANDnode->expr=PRED_AND_LIST; 1059 if (predExpr != NULL) { 1060 ANDnode->down=predExpr; 1061 tail=&predExpr->right; 1062 }; 1063 { 1064 zzBLOCK(zztasp2); 1065 zzMake0; 1066 { 1067 while ( (LA(1)==113) ) { 1068 zzmatch(113); zzCONSUME; 1069 predExpr = predPrimary(); 1070 1071 1072 if (predExpr != NULL) { 1073 *tail=predExpr; 1074 tail=&predExpr->right; 1075 }; 1076 zzLOOP(zztasp2); 1077 } 1078 zzEXIT(zztasp2); 1079 } 1080 } 1081 1082 _retv=ANDnode; 1083 ANDnode=NULL; 1084 zzEXIT(zztasp1); 1085 return _retv; 1086 fail: 1087 zzEXIT(zztasp1); 1088 predicate_free(ANDnode); 1089 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1090 zzresynch(setwd3, 0x40); 1091 return _retv; 1092 } 1093 } 1094 1095 Predicate * 1096 #ifdef __USE_PROTOS 1097 predPrimary(void) 1098 #else 1099 predPrimary() 1100 #endif 1101 { 1102 Predicate * _retv; 1103 zzRULE; 1104 zzBLOCK(zztasp1); 1105 PCCTS_PURIFY(_retv,sizeof(Predicate * )) 1106 zzMake0; 1107 { 1108 1109 char *name=NULL; 1110 PredEntry *predEntry=NULL; 1111 Predicate *predExpr=NULL; 1112 if ( (LA(1)==TokenTerm) ) { 1113 zzmatch(TokenTerm); 1114 name=mystrdup(LATEXT(1)); 1115 zzCONSUME; 1116 1117 1118 predEntry=(PredEntry *) hash_get(Pname,name); 1119 if (predEntry == NULL) { 1120 warnFL(eMsg1("no previously defined #pred with name \"%s\"",name), 1121 FileStr[CurFile],zzline); 1122 name=NULL; 1123 _retv=NULL; 1124 } else { 1125 predExpr=predicate_dup(predEntry->pred); 1126 predExpr->predEntry=predEntry; 1127 _retv=predExpr; 1128 }; 1129 } 1130 else { 1131 if ( (LA(1)==114) ) { 1132 zzmatch(114); zzCONSUME; 1133 predExpr = predOrExpr(); 1134 1135 zzmatch(115); 1136 1137 _retv=predExpr; 1138 zzCONSUME; 1139 1140 } 1141 else { 1142 if ( (LA(1)==103) ) { 1143 zzmatch(103); zzCONSUME; 1144 predExpr = predPrimary(); 1145 1146 1147 predExpr->inverted=!predExpr->inverted; 1148 _retv=predExpr; 1149 } 1150 else {zzFAIL(1,zzerr13,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1151 } 1152 } 1153 zzEXIT(zztasp1); 1154 return _retv; 1155 fail: 1156 zzEXIT(zztasp1); 1157 1158 predicate_free(predExpr); 1159 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1160 zzresynch(setwd3, 0x80); 1161 return _retv; 1162 } 1163 } 1164 1165 void 1166 #ifdef __USE_PROTOS 1167 aLexclass(void) 1168 #else 1169 aLexclass() 1170 #endif 1171 { 1172 zzRULE; 1173 zzBLOCK(zztasp1); 1174 zzMake0; 1175 { 1176 zzmatch(116); zzCONSUME; 1177 zzmatch(TokenTerm); 1178 lexclass(mystrdup(LATEXT(1))); 1179 zzCONSUME; 1180 1181 zzEXIT(zztasp1); 1182 return; 1183 fail: 1184 zzEXIT(zztasp1); 1185 CannotContinue=TRUE; 1186 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1187 zzresynch(setwd4, 0x1); 1188 } 1189 } 1190 1191 void 1192 #ifdef __USE_PROTOS 1193 error(void) 1194 #else 1195 error() 1196 #endif 1197 { 1198 zzRULE; 1199 zzBLOCK(zztasp1); 1200 zzMake0; 1201 { 1202 char *t=NULL; ECnode *e; int go=1; TermEntry *p; 1203 zzmatch(117); zzCONSUME; 1204 { 1205 zzBLOCK(zztasp2); 1206 zzMake0; 1207 { 1208 ; 1209 if ( (LA(1)==TokenTerm) ) { 1210 zzmatch(TokenTerm); 1211 t=mystrdup(LATEXT(1)); 1212 zzCONSUME; 1213 1214 } 1215 else { 1216 if ( (LA(1)==QuotedTerm) ) { 1217 zzmatch(QuotedTerm); 1218 t=mystrdup(LATEXT(1)); 1219 zzCONSUME; 1220 1221 } 1222 else {zzFAIL(1,zzerr14,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1223 } 1224 zzEXIT(zztasp2); 1225 } 1226 } 1227 e = newECnode; 1228 require(e!=NULL, "cannot allocate error class node"); 1229 e->lexclass = CurrentLexClass; 1230 if ( Tnum( (t=StripQuotes(t)) ) == 0 ) 1231 { 1232 if ( hash_get(Texpr, t) != NULL ) 1233 warn(eMsg1("errclass name conflicts with regular expression '%s'",t)); 1234 e->tok = addTname( t ); 1235 set_orel(e->tok, &imag_tokens); 1236 require((p=(TermEntry *)hash_get(Tname, t)) != NULL, 1237 "hash table mechanism is broken"); 1238 p->classname = 1; /* entry is errclass name, not token */ 1239 list_add(&eclasses, (char *)e); 1240 } 1241 else 1242 { 1243 warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t)); 1244 free( (char *)e ); 1245 go=0; 1246 } 1247 zzmatch(102); zzCONSUME; 1248 { 1249 zzBLOCK(zztasp2); 1250 zzMake0; 1251 { 1252 if ( (LA(1)==NonTerminal) ) { 1253 zzmatch(NonTerminal); 1254 if ( go ) t=mystrdup(LATEXT(1)); 1255 zzCONSUME; 1256 1257 } 1258 else { 1259 if ( (LA(1)==TokenTerm) ) { 1260 zzmatch(TokenTerm); 1261 if ( go ) t=mystrdup(LATEXT(1)); 1262 zzCONSUME; 1263 1264 } 1265 else { 1266 if ( (LA(1)==QuotedTerm) ) { 1267 zzmatch(QuotedTerm); 1268 if ( go ) t=mystrdup(LATEXT(1)); 1269 zzCONSUME; 1270 1271 } 1272 else {zzFAIL(1,zzerr15,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1273 } 1274 } 1275 zzEXIT(zztasp2); 1276 } 1277 } 1278 if ( go ) list_add(&(e->elist), t); 1279 { 1280 zzBLOCK(zztasp2); 1281 zzMake0; 1282 { 1283 while ( (setwd4[LA(1)]&0x2) ) { 1284 { 1285 zzBLOCK(zztasp3); 1286 zzMake0; 1287 { 1288 if ( (LA(1)==NonTerminal) ) { 1289 zzmatch(NonTerminal); 1290 if ( go ) t=mystrdup(LATEXT(1)); 1291 zzCONSUME; 1292 1293 } 1294 else { 1295 if ( (LA(1)==TokenTerm) ) { 1296 zzmatch(TokenTerm); 1297 if ( go ) t=mystrdup(LATEXT(1)); 1298 zzCONSUME; 1299 1300 } 1301 else { 1302 if ( (LA(1)==QuotedTerm) ) { 1303 zzmatch(QuotedTerm); 1304 if ( go ) t=mystrdup(LATEXT(1)); 1305 zzCONSUME; 1306 1307 } 1308 else {zzFAIL(1,zzerr16,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1309 } 1310 } 1311 zzEXIT(zztasp3); 1312 } 1313 } 1314 if ( go ) list_add(&(e->elist), t); 1315 zzLOOP(zztasp2); 1316 } 1317 zzEXIT(zztasp2); 1318 } 1319 } 1320 zzmatch(98); zzCONSUME; 1321 zzEXIT(zztasp1); 1322 return; 1323 fail: 1324 zzEXIT(zztasp1); 1325 CannotContinue=TRUE; 1326 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1327 zzresynch(setwd4, 0x4); 1328 } 1329 } 1330 1331 void 1332 #ifdef __USE_PROTOS 1333 tclass(void) 1334 #else 1335 tclass() 1336 #endif 1337 { 1338 zzRULE; 1339 zzBLOCK(zztasp1); 1340 zzMake0; 1341 { 1342 char *t=NULL; TCnode *e; int go=1,tok,totok; TermEntry *p, *term, *toterm; 1343 char *akaString=NULL; int save_file; int save_line; 1344 char *totext=NULL; 1345 zzmatch(118); zzCONSUME; 1346 zzmatch(TokenTerm); 1347 t=mystrdup(LATEXT(1)); 1348 zzCONSUME; 1349 1350 e = newTCnode; 1351 require(e!=NULL, "cannot allocate token class node"); 1352 e->lexclass = CurrentLexClass; 1353 if ( Tnum( t ) == 0 ) 1354 { 1355 e->tok = addTname( t ); 1356 set_orel(e->tok, &imag_tokens); 1357 set_orel(e->tok, &tokclasses); 1358 require((p=(TermEntry *)hash_get(Tname, t)) != NULL, 1359 "hash table mechanism is broken"); 1360 p->classname = 1; /* entry is class name, not token */ 1361 p->tclass = e; /* save ptr to this tclass def */ 1362 list_add(&tclasses, (char *)e); 1363 } 1364 else 1365 { 1366 warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t)); 1367 free( (char *)e ); 1368 go=0; 1369 } 1370 { 1371 zzBLOCK(zztasp2); 1372 zzMake0; 1373 { 1374 if ( (LA(1)==114) ) { 1375 zzmatch(114); zzCONSUME; 1376 zzmatch(QuotedTerm); 1377 akaString=mystrdup(StripQuotes(LATEXT(1))); 1378 /* MR11 */ save_file=CurFile;save_line=zzline; 1379 /* MR23 */ 1380 zzCONSUME; 1381 1382 zzmatch(115); zzCONSUME; 1383 } 1384 else { 1385 if ( (LA(1)==102) ) { 1386 } 1387 else {zzFAIL(1,zzerr17,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1388 } 1389 zzEXIT(zztasp2); 1390 } 1391 } 1392 1393 /* MR23 */ if (p!= NULL && akaString != NULL) { 1394 /* MR23 */ if (p->akaString != NULL) { 1395 /* MR23 */ if (strcmp(p->akaString,akaString) != 0) { 1396 /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement", 1397 /* MR23 */ t,p->akaString), 1398 /* MR23 */ FileStr[save_file],save_line); 1399 /* MR23 */ }; 1400 /* MR23 */ } else { 1401 /* MR23 */ p->akaString=akaString; 1402 /* MR23 */ }; 1403 /* MR23 */ }; 1404 /* MR23 */ 1405 zzmatch(102); zzCONSUME; 1406 { 1407 zzBLOCK(zztasp2); 1408 int zzcnt=1; 1409 zzMake0; 1410 { 1411 do { 1412 { 1413 zzBLOCK(zztasp3); 1414 zzMake0; 1415 { 1416 if ( (LA(1)==TokenTerm) ) { 1417 zzmatch(TokenTerm); 1418 if ( go ) { 1419 term = (TermEntry *) hash_get(Tname, LATEXT(1)); 1420 if ( term==NULL && UserDefdTokens ) { 1421 err("implicit token definition not allowed with #tokdefs"); 1422 go = 0; 1423 } 1424 else {t=mystrdup(LATEXT(1)); tok=addTname(LATEXT(1));} 1425 } 1426 zzCONSUME; 1427 1428 { 1429 zzBLOCK(zztasp4); 1430 zzMake0; 1431 { 1432 if ( (LA(1)==119) ) { 1433 zzmatch(119); zzCONSUME; 1434 zzmatch(TokenTerm); 1435 if ( go ) { 1436 toterm = (TermEntry *) hash_get(Tname, LATEXT(1)); 1437 if ( toterm==NULL && UserDefdTokens ) { 1438 err("implicit token definition not allowed with #tokdefs"); 1439 go = 0; 1440 } else { 1441 totext=mystrdup(LATEXT(1)); totok=addTname(LATEXT(1)); 1442 } 1443 } 1444 zzCONSUME; 1445 1446 } 1447 else { 1448 if ( (setwd4[LA(1)]&0x8) ) { 1449 } 1450 else {zzFAIL(1,zzerr18,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1451 } 1452 zzEXIT(zztasp4); 1453 } 1454 } 1455 } 1456 else { 1457 if ( (LA(1)==QuotedTerm) ) { 1458 zzmatch(QuotedTerm); 1459 if ( go ) { 1460 term = (TermEntry *) hash_get(Texpr, LATEXT(1)); 1461 if ( term==NULL && UserDefdTokens ) { 1462 err("implicit token definition not allowed with #tokdefs"); 1463 go = 0; 1464 } 1465 else {t=mystrdup(LATEXT(1)); tok=addTexpr(LATEXT(1));} 1466 } 1467 zzCONSUME; 1468 1469 } 1470 else {zzFAIL(1,zzerr19,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1471 } 1472 zzEXIT(zztasp3); 1473 } 1474 } 1475 if ( go ) { 1476 if (totext == NULL) { 1477 list_add(&(e->tlist), t); 1478 } else { 1479 list_add(&(e->tlist),".."); 1480 list_add(&(e->tlist),t); 1481 list_add(&(e->tlist),totext); 1482 } 1483 totext=NULL; 1484 } 1485 zzLOOP(zztasp2); 1486 } while ( (setwd4[LA(1)]&0x10) ); 1487 zzEXIT(zztasp2); 1488 } 1489 } 1490 zzmatch(98); zzCONSUME; 1491 zzEXIT(zztasp1); 1492 return; 1493 fail: 1494 zzEXIT(zztasp1); 1495 CannotContinue=TRUE; 1496 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1497 zzresynch(setwd4, 0x20); 1498 } 1499 } 1500 1501 void 1502 #ifdef __USE_PROTOS 1503 token(void) 1504 #else 1505 token() 1506 #endif 1507 { 1508 zzRULE; 1509 zzBLOCK(zztasp1); 1510 zzMake0; 1511 { 1512 char *t=NULL, *e=NULL, *a=NULL; int tnum=0; 1513 char *akaString=NULL; TermEntry *te;int save_file=0,save_line=0; 1514 zzmatch(120); 1515 tokenActionActive=1; 1516 zzCONSUME; 1517 1518 { 1519 zzBLOCK(zztasp2); 1520 zzMake0; 1521 { 1522 if ( (LA(1)==TokenTerm) ) { 1523 zzmatch(TokenTerm); 1524 t=mystrdup(LATEXT(1)); 1525 zzCONSUME; 1526 1527 { 1528 zzBLOCK(zztasp3); 1529 zzMake0; 1530 { 1531 if ( (LA(1)==114) ) { 1532 zzmatch(114); zzCONSUME; 1533 zzmatch(QuotedTerm); 1534 akaString=mystrdup(StripQuotes(LATEXT(1))); 1535 /* MR11 */ save_file=CurFile;save_line=zzline; 1536 /* MR11 */ 1537 zzCONSUME; 1538 1539 zzmatch(115); zzCONSUME; 1540 } 1541 else { 1542 if ( (setwd4[LA(1)]&0x40) ) { 1543 } 1544 else {zzFAIL(1,zzerr20,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1545 } 1546 zzEXIT(zztasp3); 1547 } 1548 } 1549 { 1550 zzBLOCK(zztasp3); 1551 zzMake0; 1552 { 1553 if ( (LA(1)==121) ) { 1554 zzmatch(121); zzCONSUME; 1555 zzmatch(122); 1556 tnum = atoi(LATEXT(1)); 1557 zzCONSUME; 1558 1559 } 1560 else { 1561 if ( (setwd4[LA(1)]&0x80) ) { 1562 } 1563 else {zzFAIL(1,zzerr21,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1564 } 1565 zzEXIT(zztasp3); 1566 } 1567 } 1568 } 1569 else { 1570 if ( (setwd5[LA(1)]&0x1) ) { 1571 } 1572 else {zzFAIL(1,zzerr22,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1573 } 1574 zzEXIT(zztasp2); 1575 } 1576 } 1577 { 1578 zzBLOCK(zztasp2); 1579 zzMake0; 1580 { 1581 if ( (LA(1)==QuotedTerm) ) { 1582 zzmatch(QuotedTerm); 1583 e=mystrdup(LATEXT(1)); 1584 zzCONSUME; 1585 1586 } 1587 else { 1588 if ( (setwd5[LA(1)]&0x2) ) { 1589 } 1590 else {zzFAIL(1,zzerr23,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1591 } 1592 zzEXIT(zztasp2); 1593 } 1594 } 1595 { 1596 zzBLOCK(zztasp2); 1597 zzMake0; 1598 { 1599 if ( (LA(1)==Action) ) { 1600 zzmatch(Action); 1601 1602 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 1603 require(a!=NULL, "rule token: cannot allocate action"); 1604 strcpy(a, LATEXT(1)); 1605 zzCONSUME; 1606 1607 } 1608 else { 1609 if ( (setwd5[LA(1)]&0x4) ) { 1610 } 1611 else {zzFAIL(1,zzerr24,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1612 } 1613 zzEXIT(zztasp2); 1614 } 1615 } 1616 { 1617 zzBLOCK(zztasp2); 1618 zzMake0; 1619 { 1620 if ( (LA(1)==107) ) { 1621 zzmatch(107); zzCONSUME; 1622 } 1623 else { 1624 if ( (setwd5[LA(1)]&0x8) ) { 1625 } 1626 else {zzFAIL(1,zzerr25,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1627 } 1628 zzEXIT(zztasp2); 1629 } 1630 } 1631 chkToken(t, e, a, tnum); 1632 if (t != NULL) { 1633 te=(TermEntry *)hash_get(Tname,t); 1634 if (te != NULL && akaString != NULL) { 1635 if (te->akaString != NULL) { 1636 if (strcmp(te->akaString,akaString) != 0) { 1637 warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement", 1638 t,te->akaString), 1639 FileStr[save_file],save_line); 1640 }; 1641 } else { 1642 te->akaString=akaString; 1643 }; 1644 }; 1645 }; 1646 zzEXIT(zztasp1); 1647 return; 1648 fail: 1649 zzEXIT(zztasp1); 1650 CannotContinue=TRUE; 1651 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1652 zzresynch(setwd5, 0x10); 1653 } 1654 } 1655 1656 void 1657 #ifdef __USE_PROTOS 1658 block(set * toksrefd,set * rulesrefd) 1659 #else 1660 block(toksrefd,rulesrefd) 1661 set *toksrefd; 1662 set *rulesrefd ; 1663 #endif 1664 { 1665 zzRULE; 1666 zzBLOCK(zztasp1); 1667 zzMake0; 1668 { 1669 1670 Graph g, b; 1671 set saveblah; 1672 int saveinalt = inAlt; 1673 ExceptionGroup *eg; 1674 * toksrefd = empty; 1675 * rulesrefd = empty; 1676 set_clr(AST_nodes_refd_in_actions); 1677 CurBlockID++; 1678 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; 1679 CurAltNum = 1; 1680 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; 1681 saveblah = attribsRefdFromAction; 1682 attribsRefdFromAction = empty; 1683 alt( toksrefd,rulesrefd ); 1684 b = g = zzaArg(zztasp1,1); 1685 1686 if ( ((Junction *)g.left)->p1->ntype == nAction ) 1687 { 1688 ActionNode *actionNode=(ActionNode *) 1689 ( ( (Junction *)g.left) ->p1); 1690 if (!actionNode->is_predicate ) 1691 { 1692 actionNode->init_action = TRUE; 1693 /* MR12c */ if (actionNode->noHoist) { 1694 /* MR12c */ errFL("<<nohoist>> appears as init-action - use <<>> <<nohoist>>", 1695 /* MR12c */ FileStr[actionNode->file],actionNode->line); 1696 /* MR12c */ }; 1697 } 1698 } 1699 ((Junction *)g.left)->blockid = CurBlockID; 1700 { 1701 zzBLOCK(zztasp2); 1702 zzMake0; 1703 { 1704 while ( (LA(1)==133) ) { 1705 eg = exception_group(); 1706 1707 1708 if ( eg!=NULL ) { 1709 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ 1710 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ 1711 list_add(&CurExGroups, (void *)eg); 1712 } 1713 zzLOOP(zztasp2); 1714 } 1715 zzEXIT(zztasp2); 1716 } 1717 } 1718 CurAltNum++; 1719 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; 1720 { 1721 zzBLOCK(zztasp2); 1722 zzMake0; 1723 { 1724 while ( (LA(1)==123) ) { 1725 zzmatch(123); 1726 inAlt=1; 1727 zzCONSUME; 1728 1729 alt( toksrefd,rulesrefd ); 1730 g = Or(g, zzaArg(zztasp2,2)); 1731 1732 ((Junction *)g.left)->blockid = CurBlockID; 1733 { 1734 zzBLOCK(zztasp3); 1735 zzMake0; 1736 { 1737 while ( (LA(1)==133) ) { 1738 eg = exception_group(); 1739 1740 1741 if ( eg!=NULL ) { 1742 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/ 1743 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/ 1744 list_add(&CurExGroups, (void *)eg); 1745 } 1746 zzLOOP(zztasp3); 1747 } 1748 zzEXIT(zztasp3); 1749 } 1750 } 1751 CurAltNum++; 1752 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; 1753 zzLOOP(zztasp2); 1754 } 1755 zzEXIT(zztasp2); 1756 } 1757 } 1758 zzaArg(zztasp1,0) = b; 1759 attribsRefdFromAction = saveblah; inAlt = saveinalt; 1760 zzEXIT(zztasp1); 1761 return; 1762 fail: 1763 zzEXIT(zztasp1); 1764 CannotContinue=TRUE; 1765 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1766 zzresynch(setwd5, 0x20); 1767 } 1768 } 1769 1770 void 1771 #ifdef __USE_PROTOS 1772 alt(set * toksrefd,set * rulesrefd) 1773 #else 1774 alt(toksrefd,rulesrefd) 1775 set *toksrefd; 1776 set *rulesrefd ; 1777 #endif 1778 { 1779 zzRULE; 1780 zzBLOCK(zztasp1); 1781 zzMake0; 1782 { 1783 int n=0; Graph g; int e_num=0, old_not=0; Node *node; set elems, dif; 1784 int first_on_line = 1, use_def_MT_handler = 0; 1785 g.left=NULL; g.right=NULL; 1786 1787 CurAltStart = NULL; 1788 elems = empty; 1789 inAlt = 1; 1790 { 1791 zzBLOCK(zztasp2); 1792 zzMake0; 1793 { 1794 if ( (LA(1)==88) ) { 1795 zzmatch(88); 1796 use_def_MT_handler = 1; 1797 zzCONSUME; 1798 1799 } 1800 else { 1801 if ( (setwd5[LA(1)]&0x40) ) { 1802 } 1803 else {zzFAIL(1,zzerr26,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1804 } 1805 zzEXIT(zztasp2); 1806 } 1807 } 1808 { 1809 zzBLOCK(zztasp2); 1810 zzMake0; 1811 { 1812 ; 1813 while ( (setwd5[LA(1)]&0x80) ) { 1814 { 1815 zzBLOCK(zztasp3); 1816 zzMake0; 1817 { 1818 old_not=0; 1819 if ( (LA(1)==124) ) { 1820 zzmatch(124); 1821 old_not=1; 1822 zzCONSUME; 1823 1824 } 1825 else { 1826 if ( (setwd6[LA(1)]&0x1) ) { 1827 } 1828 else {zzFAIL(1,zzerr27,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 1829 } 1830 zzEXIT(zztasp3); 1831 } 1832 } 1833 node = element( old_not, first_on_line, use_def_MT_handler ); 1834 1835 if ( node!=NULL && node->ntype!=nAction ) first_on_line = 0; 1836 1837 if ( zzaArg(zztasp2,2 ).left!=NULL ) { 1838 g = Cat(g, zzaArg(zztasp2,2)); 1839 n++; 1840 if ( node!=NULL ) { 1841 if ( node->ntype!=nAction ) e_num++; 1842 /* record record number of all rule and token refs */ 1843 if ( node->ntype==nToken ) { 1844 TokNode *tk = (TokNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1; 1845 tk->elnum = e_num; 1846 set_orel(e_num, &elems); 1847 } 1848 else if ( node->ntype==nRuleRef ) { 1849 RuleRefNode *rn = (RuleRefNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1; 1850 rn->elnum = e_num; 1851 set_orel(e_num, rulesrefd); 1852 } 1853 } 1854 } 1855 zzLOOP(zztasp2); 1856 } 1857 zzEXIT(zztasp2); 1858 } 1859 } 1860 if ( n == 0 ) g = emptyAlt(); 1861 zzaArg(zztasp1,0) = g; 1862 /* We want to reduce number of LT(i) calls and the number of 1863 * local attribute variables in C++ mode (for moment, later we'll 1864 * do for C also). However, if trees are being built, they 1865 * require most of the attrib variables to create the tree nodes 1866 * with; therefore, we gen a token ptr for each token ref in C++ 1867 */ 1868 if ( GenCC && !GenAST ) 1869 { 1870 /* This now free's the temp set -ATG 5/6/95 */ 1871 set temp; 1872 temp = set_and(elems, attribsRefdFromAction); 1873 set_orin( toksrefd, temp); 1874 set_free(temp); 1875 } 1876 else set_orin( toksrefd, elems); 1877 if ( GenCC ) { 1878 dif = set_dif(attribsRefdFromAction, elems); 1879 if ( set_deg(dif)>0 ) 1880 err("one or more $i in action(s) refer to non-token elements"); 1881 set_free(dif); 1882 } 1883 set_free(elems); 1884 set_free(attribsRefdFromAction); 1885 inAlt = 0; 1886 zzEXIT(zztasp1); 1887 return; 1888 fail: 1889 zzEXIT(zztasp1); 1890 CannotContinue=TRUE; 1891 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1892 zzresynch(setwd6, 0x2); 1893 } 1894 } 1895 1896 LabelEntry * 1897 #ifdef __USE_PROTOS 1898 element_label(void) 1899 #else 1900 element_label() 1901 #endif 1902 { 1903 LabelEntry * _retv; 1904 zzRULE; 1905 zzBLOCK(zztasp1); 1906 PCCTS_PURIFY(_retv,sizeof(LabelEntry * )) 1907 zzMake0; 1908 { 1909 TermEntry *t=NULL; LabelEntry *l=NULL; RuleEntry *r=NULL; char *lab; 1910 zzmatch(LABEL); 1911 lab = mystrdup(LATEXT(1)); 1912 zzCONSUME; 1913 1914 1915 UsedNewStyleLabel = 1; 1916 if ( UsedOldStyleAttrib ) err("cannot mix with new-style labels with old-style $i"); 1917 t = (TermEntry *) hash_get(Tname, lab); 1918 if ( t==NULL ) t = (TermEntry *) hash_get(Texpr, lab); 1919 if ( t==NULL ) r = (RuleEntry *) hash_get(Rname, lab); 1920 if ( t!=NULL ) { 1921 err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab)); 1922 _retv = NULL; 1923 } 1924 else if ( r!=NULL ) { 1925 err(eMsg1("label definition clashes with rule definition: '%s'", lab)); 1926 _retv = NULL; 1927 } 1928 else { 1929 /* we don't clash with anybody else */ 1930 l = (LabelEntry *) hash_get(Elabel, lab); 1931 if ( l==NULL ) { /* ok to add new element label */ 1932 l = (LabelEntry *)hash_add(Elabel, 1933 lab, 1934 (Entry *)newLabelEntry(lab)); 1935 /* add to list of element labels for this rule */ 1936 list_add(&CurElementLabels, (void *)lab); 1937 /* MR7 */ leAdd(l); /* list of labels waiting for exception group definitions */ 1938 _retv = l; 1939 } 1940 else { 1941 err(eMsg1("label definitions must be unique per rule: '%s'", lab)); 1942 _retv = NULL; 1943 } 1944 } 1945 zzmatch(106); zzCONSUME; 1946 zzEXIT(zztasp1); 1947 return _retv; 1948 fail: 1949 zzEXIT(zztasp1); 1950 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 1951 zzresynch(setwd6, 0x4); 1952 return _retv; 1953 } 1954 } 1955 1956 Node * 1957 #ifdef __USE_PROTOS 1958 element(int old_not,int first_on_line,int use_def_MT_handler) 1959 #else 1960 element(old_not,first_on_line,use_def_MT_handler) 1961 int old_not; 1962 int first_on_line; 1963 int use_def_MT_handler ; 1964 #endif 1965 { 1966 Node * _retv; 1967 zzRULE; 1968 zzBLOCK(zztasp1); 1969 PCCTS_PURIFY(_retv,sizeof(Node * )) 1970 zzMake0; 1971 { 1972 1973 Attrib blk; 1974 Predicate *pred = NULL; 1975 int local_use_def_MT_handler=0; 1976 ActionNode *act; 1977 RuleRefNode *rr; 1978 set toksrefd, rulesrefd; 1979 TermEntry *term; 1980 TokNode *p=NULL; RuleRefNode *q; int approx=0; 1981 LabelEntry *label=NULL; 1982 int predMsgDone=0; 1983 int semDepth=0; 1984 int ampersandStyle; 1985 int height; /* MR11 */ 1986 int equal_height; /* MR11 */ 1987 1988 char* pFirstSetSymbol = NULL; /* MR21 */ 1989 1990 _retv = NULL; 1991 if ( (setwd6[LA(1)]&0x8) ) { 1992 { 1993 zzBLOCK(zztasp2); 1994 zzMake0; 1995 { 1996 if ( (LA(1)==LABEL) ) { 1997 label = element_label(); 1998 1999 } 2000 else { 2001 if ( (setwd6[LA(1)]&0x10) ) { 2002 } 2003 else {zzFAIL(1,zzerr28,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2004 } 2005 zzEXIT(zztasp2); 2006 } 2007 } 2008 { 2009 zzBLOCK(zztasp2); 2010 zzMake0; 2011 { 2012 if ( (LA(1)==TokenTerm) ) { 2013 zzmatch(TokenTerm); 2014 2015 term = (TermEntry *) hash_get(Tname, LATEXT(1)); 2016 if ( term==NULL && UserDefdTokens ) { 2017 err("implicit token definition not allowed with #tokdefs"); 2018 zzaRet.left = zzaRet.right = NULL; 2019 } 2020 else { 2021 zzaRet = buildToken(LATEXT(1)); 2022 p=((TokNode *)((Junction *)zzaRet.left)->p1); 2023 term = (TermEntry *) hash_get(Tname, LATEXT(1)); 2024 require( term!= NULL, "hash table mechanism is broken"); 2025 p->tclass = term->tclass; 2026 p->complement = old_not; 2027 if ( label!=NULL ) { 2028 p->el_label = label->str; 2029 label->elem = (Node *)p; 2030 } 2031 } 2032 zzCONSUME; 2033 2034 { 2035 zzBLOCK(zztasp3); 2036 zzMake0; 2037 { 2038 if ( (LA(1)==119) ) { 2039 zzmatch(119); zzCONSUME; 2040 { 2041 zzBLOCK(zztasp4); 2042 zzMake0; 2043 { 2044 if ( (LA(1)==QuotedTerm) ) { 2045 zzmatch(QuotedTerm); 2046 if ( p!=NULL ) setUpperRange(p, LATEXT(1)); 2047 zzCONSUME; 2048 2049 } 2050 else { 2051 if ( (LA(1)==TokenTerm) ) { 2052 zzmatch(TokenTerm); 2053 if ( p!=NULL ) setUpperRange(p, LATEXT(1)); 2054 zzCONSUME; 2055 2056 } 2057 else {zzFAIL(1,zzerr29,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2058 } 2059 zzEXIT(zztasp4); 2060 } 2061 } 2062 } 2063 else { 2064 if ( (setwd6[LA(1)]&0x20) ) { 2065 } 2066 else {zzFAIL(1,zzerr30,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2067 } 2068 zzEXIT(zztasp3); 2069 } 2070 } 2071 2072 if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) ) 2073 list_add(&MetaTokenNodes, (void *)p); 2074 { 2075 zzBLOCK(zztasp3); 2076 zzMake0; 2077 { 2078 if ( (LA(1)==125) ) { 2079 zzmatch(125); 2080 if ( p!=NULL ) p->astnode=ASTroot; 2081 zzCONSUME; 2082 2083 } 2084 else { 2085 if ( (setwd6[LA(1)]&0x40) ) { 2086 if ( p!=NULL ) p->astnode=ASTchild; 2087 } 2088 else { 2089 if ( (LA(1)==103) ) { 2090 zzmatch(103); 2091 if ( p!=NULL ) p->astnode=ASTexclude; 2092 zzCONSUME; 2093 2094 } 2095 else {zzFAIL(1,zzerr31,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2096 } 2097 } 2098 zzEXIT(zztasp3); 2099 } 2100 } 2101 { 2102 zzBLOCK(zztasp3); 2103 zzMake0; 2104 { 2105 if ( (LA(1)==88) ) { 2106 zzmatch(88); 2107 local_use_def_MT_handler = 1; 2108 zzCONSUME; 2109 2110 } 2111 else { 2112 if ( (setwd6[LA(1)]&0x80) ) { 2113 } 2114 else {zzFAIL(1,zzerr32,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2115 } 2116 zzEXIT(zztasp3); 2117 } 2118 } 2119 2120 if ( p!=NULL && first_on_line ) { 2121 CurAltStart = (Junction *)zzaRet.left; 2122 altAdd(CurAltStart); /* MR7 */ 2123 p->altstart = CurAltStart; 2124 } 2125 if ( p!=NULL ) 2126 p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler; 2127 _retv = (Node *)p; 2128 } 2129 else { 2130 if ( (LA(1)==QuotedTerm) ) { 2131 zzmatch(QuotedTerm); 2132 2133 term = (TermEntry *) hash_get(Texpr, LATEXT(1)); 2134 if ( term==NULL && UserDefdTokens ) { 2135 err("implicit token definition not allowed with #tokdefs"); 2136 zzaRet.left = zzaRet.right = NULL; 2137 } 2138 else { 2139 zzaRet = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1); 2140 p->complement = old_not; 2141 if ( label!=NULL ) { 2142 p->el_label = label->str; 2143 label->elem = (Node *)p; 2144 } 2145 } 2146 zzCONSUME; 2147 2148 { 2149 zzBLOCK(zztasp3); 2150 zzMake0; 2151 { 2152 if ( (LA(1)==119) ) { 2153 zzmatch(119); zzCONSUME; 2154 { 2155 zzBLOCK(zztasp4); 2156 zzMake0; 2157 { 2158 if ( (LA(1)==QuotedTerm) ) { 2159 zzmatch(QuotedTerm); 2160 if ( p!=NULL ) setUpperRange(p, LATEXT(1)); 2161 zzCONSUME; 2162 2163 } 2164 else { 2165 if ( (LA(1)==TokenTerm) ) { 2166 zzmatch(TokenTerm); 2167 if ( p!=NULL ) setUpperRange(p, LATEXT(1)); 2168 zzCONSUME; 2169 2170 } 2171 else {zzFAIL(1,zzerr33,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2172 } 2173 zzEXIT(zztasp4); 2174 } 2175 } 2176 } 2177 else { 2178 if ( (setwd7[LA(1)]&0x1) ) { 2179 } 2180 else {zzFAIL(1,zzerr34,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2181 } 2182 zzEXIT(zztasp3); 2183 } 2184 } 2185 { 2186 zzBLOCK(zztasp3); 2187 zzMake0; 2188 { 2189 if ( (LA(1)==125) ) { 2190 zzmatch(125); 2191 if ( p!=NULL ) p->astnode=ASTroot; 2192 zzCONSUME; 2193 2194 } 2195 else { 2196 if ( (setwd7[LA(1)]&0x2) ) { 2197 if ( p!=NULL ) p->astnode=ASTchild; 2198 } 2199 else { 2200 if ( (LA(1)==103) ) { 2201 zzmatch(103); 2202 if ( p!=NULL ) p->astnode=ASTexclude; 2203 zzCONSUME; 2204 2205 } 2206 else {zzFAIL(1,zzerr35,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2207 } 2208 } 2209 zzEXIT(zztasp3); 2210 } 2211 } 2212 { 2213 zzBLOCK(zztasp3); 2214 zzMake0; 2215 { 2216 if ( (LA(1)==88) ) { 2217 zzmatch(88); 2218 local_use_def_MT_handler = 1; 2219 zzCONSUME; 2220 2221 } 2222 else { 2223 if ( (setwd7[LA(1)]&0x4) ) { 2224 } 2225 else {zzFAIL(1,zzerr36,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2226 } 2227 zzEXIT(zztasp3); 2228 } 2229 } 2230 2231 if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) ) 2232 list_add(&MetaTokenNodes, (void *)p); 2233 2234 if ( first_on_line ) { 2235 CurAltStart = (Junction *)zzaRet.left; 2236 altAdd(CurAltStart); /* MR7 */ 2237 p->altstart = CurAltStart; 2238 } 2239 if ( p!=NULL ) 2240 p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler; 2241 _retv = (Node *)p; 2242 } 2243 else { 2244 if ( (LA(1)==WildCard) ) { 2245 if ( old_not ) warn("~ WILDCARD is an undefined operation (implies 'nothing')"); 2246 zzmatch(WildCard); 2247 zzaRet = buildWildCard(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1); 2248 zzCONSUME; 2249 2250 { 2251 zzBLOCK(zztasp3); 2252 zzMake0; 2253 { 2254 if ( (LA(1)==125) ) { 2255 zzmatch(125); 2256 p->astnode=ASTroot; 2257 zzCONSUME; 2258 2259 } 2260 else { 2261 if ( (setwd7[LA(1)]&0x8) ) { 2262 p->astnode=ASTchild; 2263 } 2264 else { 2265 if ( (LA(1)==103) ) { 2266 zzmatch(103); 2267 p->astnode=ASTexclude; 2268 zzCONSUME; 2269 2270 } 2271 else {zzFAIL(1,zzerr37,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2272 } 2273 } 2274 zzEXIT(zztasp3); 2275 } 2276 } 2277 list_add(&MetaTokenNodes, (void *)p); 2278 2279 if ( first_on_line ) { 2280 CurAltStart = (Junction *)zzaRet.left; 2281 altAdd(CurAltStart); /* MR7 */ 2282 p->altstart = CurAltStart; 2283 if ( label!=NULL ) { 2284 p->el_label = label->str; 2285 label->elem = (Node *)p; 2286 } 2287 } 2288 _retv = (Node *)p; 2289 } 2290 else { 2291 if ( (LA(1)==NonTerminal) ) { 2292 if ( old_not ) warn("~ NONTERMINAL is an undefined operation"); 2293 zzmatch(NonTerminal); 2294 zzaRet = buildRuleRef(LATEXT(1)); 2295 zzCONSUME; 2296 2297 { 2298 zzBLOCK(zztasp3); 2299 zzMake0; 2300 { 2301 if ( (LA(1)==103) ) { 2302 zzmatch(103); 2303 q = (RuleRefNode *) ((Junction *)zzaRet.left)->p1; 2304 q->astnode=ASTexclude; 2305 zzCONSUME; 2306 2307 } 2308 else { 2309 if ( (setwd7[LA(1)]&0x10) ) { 2310 } 2311 else {zzFAIL(1,zzerr38,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2312 } 2313 zzEXIT(zztasp3); 2314 } 2315 } 2316 { 2317 zzBLOCK(zztasp3); 2318 zzMake0; 2319 { 2320 if ( (setwd7[LA(1)]&0x20) ) { 2321 { 2322 zzBLOCK(zztasp4); 2323 zzMake0; 2324 { 2325 if ( (LA(1)==104) ) { 2326 zzmatch(104); zzCONSUME; 2327 } 2328 else { 2329 if ( (LA(1)==PassAction) ) { 2330 } 2331 else {zzFAIL(1,zzerr39,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2332 } 2333 zzEXIT(zztasp4); 2334 } 2335 } 2336 zzmatch(PassAction); 2337 addParm(((Junction *)zzaRet.left)->p1, LATEXT(1)); 2338 zzCONSUME; 2339 2340 } 2341 else { 2342 if ( (setwd7[LA(1)]&0x40) ) { 2343 } 2344 else {zzFAIL(1,zzerr40,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2345 } 2346 zzEXIT(zztasp3); 2347 } 2348 } 2349 rr=(RuleRefNode *) ((Junction *)zzaRet.left)->p1; 2350 { 2351 zzBLOCK(zztasp3); 2352 zzMake0; 2353 { 2354 char *a; 2355 if ( (LA(1)==105) ) { 2356 zzmatch(105); zzCONSUME; 2357 zzmatch(PassAction); 2358 2359 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 2360 require(a!=NULL, "rule element: cannot allocate assignment"); 2361 strcpy(a, LATEXT(1)); 2362 rr->assign = a; 2363 zzCONSUME; 2364 2365 } 2366 else { 2367 if ( (setwd7[LA(1)]&0x80) ) { 2368 } 2369 else {zzFAIL(1,zzerr41,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2370 } 2371 zzEXIT(zztasp3); 2372 } 2373 } 2374 2375 if ( label!=NULL ) { 2376 rr->el_label = label->str; 2377 label->elem = (Node *)rr; 2378 } 2379 if ( first_on_line ) { 2380 CurAltStart = (Junction *)zzaRet.left; 2381 altAdd(CurAltStart); /* MR7 */ 2382 ((RuleRefNode *)((Junction *)zzaRet.left)->p1)->altstart = CurAltStart; 2383 } 2384 _retv = (Node *)rr; 2385 } 2386 else {zzFAIL(1,zzerr42,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2387 } 2388 } 2389 } 2390 zzEXIT(zztasp2); 2391 } 2392 } 2393 } 2394 else { 2395 if ( (LA(1)==Action) ) { 2396 if ( old_not ) warn("~ ACTION is an undefined operation"); 2397 zzmatch(Action); 2398 zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 0); 2399 zzCONSUME; 2400 2401 if ( first_on_line ) { /* MR7 */ 2402 CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */ 2403 altAdd(CurAltStart); /* MR7 */ 2404 }; 2405 _retv = (Node *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1; 2406 } 2407 else { 2408 if ( (LA(1)==Pred) ) { 2409 if ( old_not ) warn("~ SEMANTIC-PREDICATE is an undefined operation"); 2410 zzmatch(Pred); 2411 zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 1); 2412 zzCONSUME; 2413 2414 act = (ActionNode *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1; 2415 if (numericActionLabel) { /* MR10 */ 2416 list_add(&NumericPredLabels,act); /* MR10 */ 2417 numericActionLabel=0; /* MR10 */ 2418 }; /* MR10 */ 2419 { 2420 zzBLOCK(zztasp2); 2421 zzMake0; 2422 { 2423 char *a; 2424 if ( (LA(1)==PassAction) ) { 2425 zzmatch(PassAction); 2426 2427 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 2428 require(a!=NULL, "rule element: cannot allocate predicate fail action"); 2429 strcpy(a, LATEXT(1)); 2430 act->pred_fail = a; 2431 zzCONSUME; 2432 2433 } 2434 else { 2435 if ( (setwd8[LA(1)]&0x1) ) { 2436 } 2437 else {zzFAIL(1,zzerr43,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2438 } 2439 zzEXIT(zztasp2); 2440 } 2441 } 2442 if ( first_on_line ) { /* MR7 */ 2443 CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */ 2444 altAdd(CurAltStart); /* MR7 */ 2445 }; 2446 _retv = (Node *)act; 2447 } 2448 else { 2449 if ( (setwd8[LA(1)]&0x2) ) { 2450 if ( old_not ) warn("~ BLOCK is an undefined operation"); 2451 BlkLevel++; 2452 if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply"); 2453 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID; 2454 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum; 2455 { 2456 zzBLOCK(zztasp2); 2457 zzMake0; 2458 { 2459 if ( (LA(1)==Pragma) ) { 2460 zzmatch(Pragma); zzCONSUME; 2461 { 2462 zzBLOCK(zztasp3); 2463 zzMake0; 2464 { 2465 if ( (LA(1)==126) ) { 2466 zzmatch(126); 2467 approx=LL_k; 2468 zzCONSUME; 2469 2470 } 2471 else { 2472 if ( (LA(1)==127) ) { 2473 zzmatch(127); 2474 approx = 1; 2475 zzCONSUME; 2476 2477 } 2478 else { 2479 if ( (LA(1)==128) ) { 2480 zzmatch(128); 2481 approx = 2; 2482 zzCONSUME; 2483 2484 } 2485 else {zzFAIL(1,zzerr44,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2486 } 2487 } 2488 zzEXIT(zztasp3); 2489 } 2490 } 2491 } 2492 else { 2493 if ( (setwd8[LA(1)]&0x4) ) { 2494 } 2495 else {zzFAIL(1,zzerr45,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2496 } 2497 zzEXIT(zztasp2); 2498 } 2499 } 2500 { 2501 zzBLOCK(zztasp2); 2502 zzMake0; 2503 { 2504 if ( (LA(1)==FirstSetSymbol) ) { 2505 zzmatch(FirstSetSymbol); zzCONSUME; 2506 zzmatch(114); zzCONSUME; 2507 { 2508 zzBLOCK(zztasp3); 2509 zzMake0; 2510 { 2511 if ( (LA(1)==NonTerminal) ) { 2512 zzmatch(NonTerminal); 2513 2514 /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, 2515 /* MR21 */ sizeof(char)); 2516 /* MR21 */ require(pFirstSetSymbol!=NULL, 2517 /* MR21 */ "cannot allocate first set name"); 2518 /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); 2519 /* MR21 */ 2520 zzCONSUME; 2521 2522 } 2523 else { 2524 if ( (LA(1)==TokenTerm) ) { 2525 zzmatch(TokenTerm); 2526 2527 /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1, 2528 /* MR21 */ sizeof(char)); 2529 /* MR21 */ require(pFirstSetSymbol!=NULL, 2530 /* MR21 */ "cannot allocate first set name"); 2531 /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1)); 2532 /* MR21 */ 2533 zzCONSUME; 2534 2535 } 2536 else {zzFAIL(1,zzerr46,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2537 } 2538 zzEXIT(zztasp3); 2539 } 2540 } 2541 zzmatch(115); zzCONSUME; 2542 } 2543 else { 2544 if ( (setwd8[LA(1)]&0x8) ) { 2545 } 2546 else {zzFAIL(1,zzerr47,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2547 } 2548 zzEXIT(zztasp2); 2549 } 2550 } 2551 { 2552 zzBLOCK(zztasp2); 2553 zzMake0; 2554 { 2555 if ( (LA(1)==114) ) { 2556 zzmatch(114); zzCONSUME; 2557 block( &toksrefd,&rulesrefd ); 2558 zzmatch(115); 2559 blk = zzaRet = zzaArg(zztasp2,2); 2560 /* MR23 */ CurBlockID_array[BlkLevel] = (-1); 2561 /* MR23 */ CurAltNum_array[BlkLevel] = (-1); 2562 --BlkLevel; 2563 zzCONSUME; 2564 2565 { 2566 zzBLOCK(zztasp3); 2567 zzMake0; 2568 { 2569 if ( (LA(1)==129) ) { 2570 zzmatch(129); 2571 zzaRet = makeLoop(zzaRet,approx,pFirstSetSymbol); 2572 zzCONSUME; 2573 2574 } 2575 else { 2576 if ( (LA(1)==130) ) { 2577 zzmatch(130); 2578 zzaRet = makePlus(zzaRet,approx,pFirstSetSymbol); 2579 zzCONSUME; 2580 2581 } 2582 else { 2583 if ( (LA(1)==131) ) { 2584 zzmatch(131); zzCONSUME; 2585 { 2586 zzBLOCK(zztasp4); 2587 zzMake0; 2588 { 2589 if ( (setwd8[LA(1)]&0x10) ) { 2590 { 2591 zzBLOCK(zztasp5); 2592 zzMake0; 2593 { 2594 if ( (LA(1)==132) ) { 2595 zzmatch(132); 2596 ampersandStyle=0; 2597 zzCONSUME; 2598 2599 } 2600 else { 2601 if ( (LA(1)==113) ) { 2602 zzmatch(113); 2603 ampersandStyle=1; 2604 zzCONSUME; 2605 2606 } 2607 else {zzFAIL(1,zzerr48,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2608 } 2609 zzEXIT(zztasp5); 2610 } 2611 } 2612 zzmatch(Pred); 2613 zzaRet = buildAction(LATEXT(1),action_file,action_line,1); 2614 zzCONSUME; 2615 2616 act = (ActionNode *) ((Junction *)zzaRet.left)->p1; 2617 semDepth=predicateLookaheadDepth(act); 2618 if (numericActionLabel) { /* MR10 */ 2619 list_add(&NumericPredLabels,act); /* MR10 */ 2620 numericActionLabel=0; /* MR10 */ 2621 }; /* MR10 */ 2622 { 2623 zzBLOCK(zztasp5); 2624 zzMake0; 2625 { 2626 char *a; 2627 if ( (LA(1)==PassAction) ) { 2628 zzmatch(PassAction); 2629 2630 a = (char *)calloc(strlen(LATEXT(1))+1, sizeof(char)); 2631 require(a!=NULL, "rule element: cannot allocate predicate fail action"); 2632 strcpy(a, LATEXT(1)); 2633 act->pred_fail = a; 2634 zzCONSUME; 2635 2636 } 2637 else { 2638 if ( (setwd8[LA(1)]&0x20) ) { 2639 } 2640 else {zzFAIL(1,zzerr49,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2641 } 2642 zzEXIT(zztasp5); 2643 } 2644 } 2645 if ( first_on_line) { /* MR7 */ 2646 CurAltStart=(Junction *)zzaRet.left; /* MR7 */ 2647 altAdd(CurAltStart); /* MR7 */ 2648 }; 2649 _retv = (Node *)act; 2650 2651 pred = computePredFromContextGuard(blk,&predMsgDone); /* MR10 */ 2652 if ( pred==NULL) { /* MR10 */ 2653 if ( !predMsgDone) err("invalid or missing context guard"); /* MR10 */ 2654 predMsgDone=1; /* MR10 */ 2655 } else { /* MR10 */ 2656 act->guardNodes=(Junction *)blk.left; /* MR11 */ 2657 pred->expr = act->action; 2658 pred->source = act; 2659 /* MR10 */ pred->ampersandStyle = ampersandStyle; /* 0 means (g)? => ... 1 means (g)? && ... */ 2660 /* MR13 */ if (pred->tcontext != NULL) { 2661 /* MR13 */ height=MR_max_height_of_tree(pred->tcontext); 2662 /* MR13 */ equal_height=MR_all_leaves_same_height(pred->tcontext,height); 2663 /* MR13 */ if (! equal_height) { 2664 /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height", 2665 /* MR13 */ FileStr[act->file],act->line); 2666 /* MR13 */ }; 2667 /* MR13 */ } 2668 /* MR10 */ if (ampersandStyle) { 2669 /* MR10 */ act->ampersandPred = pred; 2670 /* MR11 */ if (! HoistPredicateContext) { 2671 /* MR11 */ errFL("without \"-prc on\" (guard)? && <<pred>>? ... doesn't make sense", 2672 /* MR11 */ FileStr[act->file],act->line); 2673 /* MR11 */ }; 2674 /* MR10 */ } else { 2675 /* MR10 */ act->guardpred = pred; 2676 /* MR10 */ }; 2677 /* MR10 */ if (pred->k != semDepth) { 2678 /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)", 2679 /* MR10 */ pred->k,semDepth)); 2680 /* MR10 */ }; 2681 } 2682 } 2683 else { 2684 if ( (setwd8[LA(1)]&0x40) ) { 2685 zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol); 2686 FoundGuessBlk = 1; 2687 ((Junction *) ((Junction *)zzaRet.left)->p1)->guess=1; 2688 if ( ! first_on_line ) { 2689 err("(...)? predicate must be first element of production"); 2690 } 2691 } 2692 else {zzFAIL(1,zzerr50,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2693 } 2694 zzEXIT(zztasp4); 2695 } 2696 } 2697 } 2698 else { 2699 if ( (setwd8[LA(1)]&0x80) ) { 2700 zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol); 2701 } 2702 else {zzFAIL(1,zzerr51,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2703 } 2704 } 2705 } 2706 zzEXIT(zztasp3); 2707 } 2708 } 2709 2710 if ( pred==NULL && !predMsgDone) { /* MR10 */ 2711 ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID; 2712 ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd; 2713 ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd; 2714 if ( first_on_line ) { /* MR7 */ 2715 CurAltStart = (Junction *)((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */ 2716 altAdd(CurAltStart); /* MR7 */ 2717 }; /* MR7 */ 2718 _retv = (Node *) ((Junction *)zzaRet.left)->p1; 2719 } 2720 } 2721 else { 2722 if ( (LA(1)==102) ) { 2723 zzmatch(102); zzCONSUME; 2724 block( &toksrefd,&rulesrefd ); 2725 zzaRet = makeOpt(zzaArg(zztasp2,2),approx,pFirstSetSymbol); 2726 /* MR23 */ CurBlockID_array[BlkLevel] = (-1); 2727 /* MR23 */ CurAltNum_array[BlkLevel] = (-1); 2728 --BlkLevel; 2729 zzmatch(98); 2730 2731 ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID; 2732 ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd; 2733 ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd; 2734 zzCONSUME; 2735 2736 if ( first_on_line ) { /* MR7 */ 2737 CurAltStart = (Junction *) ((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */ 2738 altAdd(CurAltStart); /* MR7 */ 2739 }; 2740 _retv = (Node *) ((Junction *)zzaRet.left)->p1; 2741 } 2742 else {zzFAIL(1,zzerr52,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2743 } 2744 zzEXIT(zztasp2); 2745 } 2746 } 2747 } 2748 else { 2749 if ( (LA(1)==129) ) { 2750 zzmatch(129); 2751 warn("don't you want a ')' with that '*'?"); CannotContinue=TRUE; 2752 zzCONSUME; 2753 2754 } 2755 else { 2756 if ( (LA(1)==130) ) { 2757 zzmatch(130); 2758 warn("don't you want a ')' with that '+'?"); CannotContinue=TRUE; 2759 zzCONSUME; 2760 2761 } 2762 else { 2763 if ( (LA(1)==105) ) { 2764 zzmatch(105); 2765 warn("'>' can only appear after a nonterminal"); CannotContinue=TRUE; 2766 zzCONSUME; 2767 2768 } 2769 else { 2770 if ( (LA(1)==PassAction) ) { 2771 zzmatch(PassAction); 2772 warn("[...] out of context 'rule > [...]'"); 2773 CannotContinue=TRUE; 2774 zzCONSUME; 2775 2776 } 2777 else {zzFAIL(1,zzerr53,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2778 } 2779 } 2780 } 2781 } 2782 } 2783 } 2784 } 2785 zzEXIT(zztasp1); 2786 return _retv; 2787 fail: 2788 zzEXIT(zztasp1); 2789 CannotContinue=TRUE; 2790 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 2791 zzresynch(setwd9, 0x1); 2792 return _retv; 2793 } 2794 } 2795 2796 void 2797 #ifdef __USE_PROTOS 2798 default_exception_handler(void) 2799 #else 2800 default_exception_handler() 2801 #endif 2802 { 2803 zzRULE; 2804 zzBLOCK(zztasp1); 2805 zzMake0; 2806 { 2807 DefaultExGroup = exception_group(); 2808 2809 zzEXIT(zztasp1); 2810 return; 2811 fail: 2812 zzEXIT(zztasp1); 2813 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 2814 zzresynch(setwd9, 0x2); 2815 } 2816 } 2817 2818 ExceptionGroup * 2819 #ifdef __USE_PROTOS 2820 exception_group(void) 2821 #else 2822 exception_group() 2823 #endif 2824 { 2825 ExceptionGroup * _retv; 2826 zzRULE; 2827 zzBLOCK(zztasp1); 2828 PCCTS_PURIFY(_retv,sizeof(ExceptionGroup * )) 2829 zzMake0; 2830 { 2831 ExceptionHandler *h; LabelEntry *label=NULL; /* MR6 */ 2832 FoundException = 1; FoundExceptionGroup = 1; 2833 zzmatch(133); 2834 _retv = (ExceptionGroup *)calloc(1, sizeof(ExceptionGroup)); 2835 zzCONSUME; 2836 2837 { 2838 zzBLOCK(zztasp2); 2839 zzMake0; 2840 { 2841 char *p; 2842 if ( (LA(1)==PassAction) ) { 2843 zzmatch(PassAction); 2844 2845 p = LATEXT(1)+1; 2846 p[strlen(p)-1] = '\0'; /* kill trailing space */ 2847 label = (LabelEntry *) hash_get(Elabel, LATEXT(1)+1); 2848 if ( label==NULL ) 2849 { 2850 err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1)); 2851 } 2852 zzCONSUME; 2853 2854 } 2855 else { 2856 if ( (setwd9[LA(1)]&0x4) ) { 2857 } 2858 else {zzFAIL(1,zzerr54,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2859 } 2860 zzEXIT(zztasp2); 2861 } 2862 } 2863 { 2864 zzBLOCK(zztasp2); 2865 zzMake0; 2866 { 2867 while ( (LA(1)==135) ) { 2868 h = exception_handler(); 2869 2870 list_add(&(_retv->handlers), (void *)h); 2871 zzLOOP(zztasp2); 2872 } 2873 zzEXIT(zztasp2); 2874 } 2875 } 2876 { 2877 zzBLOCK(zztasp2); 2878 zzMake0; 2879 { 2880 if ( (LA(1)==134) ) { 2881 zzmatch(134); zzCONSUME; 2882 zzmatch(106); zzCONSUME; 2883 zzmatch(Action); 2884 { 2885 ExceptionHandler *eh = (ExceptionHandler *) 2886 calloc(1, sizeof(ExceptionHandler)); 2887 char *a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 2888 require(eh!=NULL, "exception: cannot allocate handler"); 2889 require(a!=NULL, "exception: cannot allocate action"); 2890 strcpy(a, LATEXT(1)); 2891 eh->action = a; 2892 eh->signalname = (char *) calloc(strlen("default")+1, sizeof(char)); 2893 require(eh->signalname!=NULL, "exception: cannot allocate sig name"); 2894 strcpy(eh->signalname, "default"); 2895 list_add(&(_retv->handlers), (void *)eh); 2896 } 2897 zzCONSUME; 2898 2899 } 2900 else { 2901 if ( (setwd9[LA(1)]&0x8) ) { 2902 } 2903 else {zzFAIL(1,zzerr55,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 2904 } 2905 zzEXIT(zztasp2); 2906 } 2907 } 2908 2909 if ( label!=NULL ) { 2910 /* Record ex group in sym tab for this label */ 2911 if ( label->ex_group!=NULL ) { 2912 err(eMsg1("duplicate exception handler for label '%s'",label->str)); 2913 } else { 2914 label->ex_group = _retv; 2915 /* Label the exception group itself */ 2916 _retv->label = label->str; 2917 /* Make the labelled element pt to the exception also */ 2918 /* MR6 */ if (label->elem == NULL) { 2919 /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label->str)); 2920 /* MR6 */ } else { 2921 switch ( label->elem->ntype ) { 2922 case nRuleRef : 2923 { 2924 RuleRefNode *r = (RuleRefNode *)label->elem; 2925 r->ex_group = _retv; 2926 break; 2927 } 2928 case nToken : 2929 { 2930 TokNode *t = (TokNode *)label->elem; 2931 t->ex_group = _retv; 2932 break; 2933 } 2934 } /* end switch */ 2935 /* MR6 */ }; /* end test on label->elem */ 2936 } /* end test on label->ex_group */ 2937 2938 } /* end test on exception label */ 2939 2940 /* MR7 */ 2941 /* MR7 */ if (BlkLevel == 1 && label == NULL) { 2942 /* MR7 */ _retv->forRule=1; 2943 /* MR7 */ } else if (label == NULL) { 2944 /* MR7 */ _retv->altID = makeAltID(CurBlockID_array[BlkLevel], CurAltNum_array[BlkLevel]); 2945 /* MR7 */ egAdd(_retv); 2946 /* MR7 */ } else { 2947 /* MR7 */ _retv->labelEntry=label; 2948 /* MR7 */ }; 2949 /* MR7 */ 2950 /* MR7 */ /* You may want to remove this exc from the rule list */ 2951 /* MR7 */ /* and handle at the labeled element site. */ 2952 /* MR7 */ 2953 /* MR7 */ if (label != NULL) { 2954 /* MR7 */ _retv = NULL; 2955 /* MR7 */ }; 2956 zzEXIT(zztasp1); 2957 return _retv; 2958 fail: 2959 zzEXIT(zztasp1); 2960 CannotContinue=TRUE; 2961 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 2962 zzresynch(setwd9, 0x10); 2963 return _retv; 2964 } 2965 } 2966 2967 ExceptionHandler * 2968 #ifdef __USE_PROTOS 2969 exception_handler(void) 2970 #else 2971 exception_handler() 2972 #endif 2973 { 2974 ExceptionHandler * _retv; 2975 zzRULE; 2976 zzBLOCK(zztasp1); 2977 PCCTS_PURIFY(_retv,sizeof(ExceptionHandler * )) 2978 zzMake0; 2979 { 2980 ; 2981 zzmatch(135); 2982 2983 _retv = (ExceptionHandler *)calloc(1, sizeof(ExceptionHandler)); 2984 require(_retv!=NULL, "exception: cannot allocate handler"); 2985 zzCONSUME; 2986 2987 { 2988 zzBLOCK(zztasp2); 2989 zzMake0; 2990 { 2991 if ( (LA(1)==NonTerminal) ) { 2992 zzmatch(NonTerminal); 2993 2994 _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 2995 require(_retv->signalname!=NULL, "exception: cannot allocate sig name"); 2996 strcpy(_retv->signalname, LATEXT(1)); 2997 zzCONSUME; 2998 2999 } 3000 else { 3001 if ( (LA(1)==TokenTerm) ) { 3002 zzmatch(TokenTerm); 3003 3004 _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 3005 require(_retv->signalname!=NULL, "exception: cannot allocate sig name"); 3006 strcpy(_retv->signalname, LATEXT(1)); 3007 zzCONSUME; 3008 3009 } 3010 else {zzFAIL(1,zzerr56,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3011 } 3012 zzEXIT(zztasp2); 3013 } 3014 } 3015 zzmatch(106); zzCONSUME; 3016 { 3017 zzBLOCK(zztasp2); 3018 zzMake0; 3019 { 3020 _retv->action = NULL; 3021 if ( (LA(1)==Action) ) { 3022 zzmatch(Action); 3023 3024 _retv->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char)); 3025 require(_retv->action!=NULL, "exception: cannot allocate action"); 3026 strcpy(_retv->action, LATEXT(1)); 3027 zzCONSUME; 3028 3029 } 3030 else { 3031 if ( (setwd9[LA(1)]&0x20) ) { 3032 } 3033 else {zzFAIL(1,zzerr57,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3034 } 3035 zzEXIT(zztasp2); 3036 } 3037 } 3038 zzEXIT(zztasp1); 3039 return _retv; 3040 fail: 3041 zzEXIT(zztasp1); 3042 CannotContinue=TRUE; 3043 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 3044 zzresynch(setwd9, 0x40); 3045 return _retv; 3046 } 3047 } 3048 3049 void 3050 #ifdef __USE_PROTOS 3051 enum_file(char * fname) 3052 #else 3053 enum_file(fname) 3054 char *fname ; 3055 #endif 3056 { 3057 zzRULE; 3058 zzBLOCK(zztasp1); 3059 zzMake0; 3060 { 3061 if ( (setwd9[LA(1)]&0x80) ) { 3062 { 3063 zzBLOCK(zztasp2); 3064 zzMake0; 3065 { 3066 if ( (LA(1)==143) ) { 3067 zzmatch(143); zzCONSUME; 3068 zzmatch(ID); zzCONSUME; 3069 { 3070 zzBLOCK(zztasp3); 3071 zzMake0; 3072 { 3073 if ( (LA(1)==149) ) { 3074 zzmatch(149); zzCONSUME; 3075 zzmatch(ID); zzCONSUME; 3076 } 3077 else { 3078 if ( (setwd10[LA(1)]&0x1) ) { 3079 } 3080 else {zzFAIL(1,zzerr58,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3081 } 3082 zzEXIT(zztasp3); 3083 } 3084 } 3085 } 3086 else { 3087 if ( (setwd10[LA(1)]&0x2) ) { 3088 } 3089 else {zzFAIL(1,zzerr59,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3090 } 3091 zzEXIT(zztasp2); 3092 } 3093 } 3094 { 3095 zzBLOCK(zztasp2); 3096 zzMake0; 3097 { 3098 if ( (LA(1)==151) ) { 3099 { 3100 zzBLOCK(zztasp3); 3101 int zzcnt=1; 3102 zzMake0; 3103 { 3104 do { 3105 enum_def( fname ); 3106 zzLOOP(zztasp3); 3107 } while ( (LA(1)==151) ); 3108 zzEXIT(zztasp3); 3109 } 3110 } 3111 } 3112 else { 3113 if ( (LA(1)==149) ) { 3114 defines( fname ); 3115 } 3116 else {zzFAIL(1,zzerr60,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3117 } 3118 zzEXIT(zztasp2); 3119 } 3120 } 3121 } 3122 else { 3123 if ( (LA(1)==Eof) ) { 3124 } 3125 else {zzFAIL(1,zzerr61,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3126 } 3127 zzEXIT(zztasp1); 3128 return; 3129 fail: 3130 zzEXIT(zztasp1); 3131 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 3132 zzresynch(setwd10, 0x4); 3133 } 3134 } 3135 3136 void 3137 #ifdef __USE_PROTOS 3138 defines(char * fname) 3139 #else 3140 defines(fname) 3141 char *fname ; 3142 #endif 3143 { 3144 zzRULE; 3145 zzBLOCK(zztasp1); 3146 zzMake0; 3147 { 3148 int v; int maxt=(-1); char *t; 3149 { 3150 zzBLOCK(zztasp2); 3151 int zzcnt=1; 3152 zzMake0; 3153 { 3154 do { 3155 zzmatch(149); zzCONSUME; 3156 zzmatch(ID); 3157 t = mystrdup(LATEXT(1)); 3158 zzCONSUME; 3159 3160 zzmatch(INT); 3161 3162 v = atoi(LATEXT(1)); 3163 /* fprintf(stderr, "#token %s=%d\n", t, v);*/ 3164 3165 /* MR2 Andreas Magnusson (Andreas.Magnusson (at) mailbox.swipnet.se) */ 3166 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ 3167 /* MR2 Don't let #tokdefs be confused by */ 3168 /* MR2 DLGminToken and DLGmaxToken */ 3169 3170 if ( ! isDLGmaxToken(t)) { /* MR2 */ 3171 TokenNum = v; 3172 if ( v>maxt ) maxt=v; 3173 if ( Tnum( t ) == 0 ) { 3174 addForcedTname( t, v ); 3175 } else { 3176 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); 3177 }; 3178 }; 3179 zzCONSUME; 3180 3181 zzLOOP(zztasp2); 3182 } while ( (LA(1)==149) ); 3183 zzEXIT(zztasp2); 3184 } 3185 } 3186 TokenNum = maxt + 1; 3187 zzEXIT(zztasp1); 3188 return; 3189 fail: 3190 zzEXIT(zztasp1); 3191 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 3192 zzresynch(setwd10, 0x8); 3193 } 3194 } 3195 3196 void 3197 #ifdef __USE_PROTOS 3198 enum_def(char * fname) 3199 #else 3200 enum_def(fname) 3201 char *fname ; 3202 #endif 3203 { 3204 zzRULE; 3205 zzBLOCK(zztasp1); 3206 zzMake0; 3207 { 3208 int v= 0; int maxt=(-1); char *t; 3209 zzmatch(151); zzCONSUME; 3210 zzmatch(ID); zzCONSUME; 3211 zzmatch(152); zzCONSUME; 3212 zzmatch(ID); 3213 t = mystrdup(LATEXT(1)); 3214 zzCONSUME; 3215 3216 { 3217 zzBLOCK(zztasp2); 3218 zzMake0; 3219 { 3220 if ( (LA(1)==153) ) { 3221 zzmatch(153); zzCONSUME; 3222 zzmatch(INT); 3223 v=atoi(LATEXT(1)); 3224 zzCONSUME; 3225 3226 } 3227 else { 3228 if ( (setwd10[LA(1)]&0x10) ) { 3229 v++; 3230 } 3231 else {zzFAIL(1,zzerr62,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3232 } 3233 zzEXIT(zztasp2); 3234 } 3235 } 3236 3237 /* fprintf(stderr, "#token %s=%d\n", t, v);*/ 3238 TokenNum = v; 3239 if ( v>maxt ) maxt=v; /* MR3 */ 3240 if ( Tnum( t ) == 0 ) addForcedTname( t, v ); 3241 else { 3242 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); 3243 } 3244 { 3245 zzBLOCK(zztasp2); 3246 zzMake0; 3247 { 3248 while ( (LA(1)==154) ) { 3249 zzmatch(154); zzCONSUME; 3250 { 3251 zzBLOCK(zztasp3); 3252 zzMake0; 3253 { 3254 if ( (LA(1)==ID)&&(isDLGmaxToken(LATEXT(1))) ) { 3255 if (!(isDLGmaxToken(LATEXT(1))) ) {zzfailed_pred(" isDLGmaxToken(LATEXT(1))",0 /* report */, { 0; /* no user action */ } );} 3256 zzmatch(ID); zzCONSUME; 3257 { 3258 zzBLOCK(zztasp4); 3259 zzMake0; 3260 { 3261 if ( (LA(1)==153) ) { 3262 zzmatch(153); zzCONSUME; 3263 zzmatch(INT); zzCONSUME; 3264 } 3265 else { 3266 if ( (setwd10[LA(1)]&0x20) ) { 3267 } 3268 else {zzFAIL(1,zzerr63,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3269 } 3270 zzEXIT(zztasp4); 3271 } 3272 } 3273 } 3274 else { 3275 if ( (LA(1)==ID) ) { 3276 zzmatch(ID); 3277 t = mystrdup(LATEXT(1)); 3278 zzCONSUME; 3279 3280 { 3281 zzBLOCK(zztasp4); 3282 zzMake0; 3283 { 3284 if ( (LA(1)==153) ) { 3285 zzmatch(153); zzCONSUME; 3286 zzmatch(INT); 3287 v=atoi(LATEXT(1)); 3288 zzCONSUME; 3289 3290 } 3291 else { 3292 if ( (setwd10[LA(1)]&0x40) ) { 3293 v++; 3294 } 3295 else {zzFAIL(1,zzerr64,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3296 } 3297 zzEXIT(zztasp4); 3298 } 3299 } 3300 3301 /* fprintf(stderr, "#token %s=%d\n", t, v);*/ 3302 TokenNum = v; 3303 if ( v>maxt ) maxt=v; /* MR3 */ 3304 if ( Tnum( t ) == 0 ) addForcedTname( t, v ); 3305 else { 3306 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline); 3307 } 3308 } 3309 else { 3310 if ( (setwd10[LA(1)]&0x80) ) { 3311 } 3312 else {zzFAIL(1,zzerr65,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;} 3313 } 3314 } 3315 zzEXIT(zztasp3); 3316 } 3317 } 3318 zzLOOP(zztasp2); 3319 } 3320 zzEXIT(zztasp2); 3321 } 3322 } 3323 zzmatch(155); zzCONSUME; 3324 zzmatch(156); 3325 TokenNum = maxt + 1; 3326 zzCONSUME; 3327 3328 zzEXIT(zztasp1); 3329 return; 3330 fail: 3331 zzEXIT(zztasp1); 3332 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText); 3333 zzresynch(setwd11, 0x1); 3334 } 3335 } 3336 3337 3338 /* MR2 Andreas Magnusson (Andreas.Magnusson (at) mailbox.swipnet.se) */ 3339 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */ 3340 /* MR2 Don't let #tokdefs be confused by */ 3341 /* MR2 DLGminToken and DLGmaxToken */ 3342 3343 /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */ 3344 3345 #ifdef __USE_PROTOS 3346 static int isDLGmaxToken(char *Token) 3347 #else 3348 static int isDLGmaxToken(Token) 3349 char * Token; 3350 #endif 3351 { 3352 static char checkStr1[] = "DLGmaxToken"; 3353 static char checkStr2[] = "DLGminToken"; 3354 3355 if (strcmp(Token, checkStr1) == 0) 3356 return 1; 3357 else if (strcmp(Token, checkStr2) == 0) 3358 return 1; 3359 else 3360 return 0; 3361 } 3362 3363 /* semantics of #token */ 3364 static void 3365 #ifdef __USE_PROTOS 3366 chkToken(char *t, char *e, char *a, int tnum) 3367 #else 3368 chkToken(t,e,a,tnum) 3369 char *t, *e, *a; 3370 int tnum; 3371 #endif 3372 { 3373 TermEntry *p; 3374 3375 /* check to see that they don't try to redefine a token as a token class */ 3376 if ( t!=NULL ) { 3377 p = (TermEntry *) hash_get(Tname, t); 3378 if ( p!=NULL && p->classname ) { 3379 err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t)); 3380 if ( a!=NULL ) free((char *)a); 3381 return; 3382 } 3383 } 3384 3385 if ( t==NULL && e==NULL ) { /* none found */ 3386 err("#token requires at least token name or rexpr"); 3387 } 3388 else if ( t!=NULL && e!=NULL ) { /* both found */ 3389 if ( UserDefdTokens ) { /* if #tokdefs, must not define new */ 3390 p = (TermEntry *) hash_get(Tname, t); 3391 if ( p == NULL) { 3392 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); 3393 return; 3394 }; 3395 } 3396 Tklink(t, e); 3397 if ( a!=NULL ) { 3398 if ( hasAction(e) ) { 3399 err(eMsg1("redefinition of action for %s; ignored",e)); 3400 } 3401 else setHasAction(e, a); 3402 } 3403 } 3404 else if ( t!=NULL ) { /* only one found */ 3405 if ( UserDefdTokens ) { 3406 p = (TermEntry *) hash_get(Tname, t); 3407 if (p == NULL) { 3408 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t)); 3409 }; 3410 return; 3411 } 3412 if ( Tnum( t ) == 0 ) addTname( t ); 3413 else { 3414 err(eMsg1("redefinition of token %s; ignored",t)); 3415 } 3416 if ( a!=NULL ) { 3417 err(eMsg1("action cannot be attached to a token name (%s); ignored",t)); 3418 free((char *)a); 3419 } 3420 } 3421 else if ( e!=NULL ) { 3422 if ( Tnum( e ) == 0 ) addTexpr( e ); 3423 else { 3424 if ( hasAction(e) ) { 3425 err(eMsg1("redefinition of action for expr %s; ignored",e)); 3426 } 3427 else if ( a==NULL ) { 3428 err(eMsg1("redefinition of expr %s; ignored",e)); 3429 } 3430 } 3431 if ( a!=NULL ) setHasAction(e, a); 3432 } 3433 3434 /* if a token type number was specified, then add the token ID and 'tnum' 3435 * pair to the ForcedTokens list. (only applies if an id was given) 3436 */ 3437 if ( t!=NULL && tnum>0 ) 3438 { 3439 if ( set_el(tnum, reserved_positions) ) 3440 { 3441 err(eMsgd("a token has already been forced to token number %d; ignored", tnum)); 3442 } 3443 else 3444 { 3445 list_add(&ForcedTokens, newForcedToken(t,tnum)); 3446 set_orel(tnum, &reserved_positions); 3447 } 3448 } 3449 } 3450 3451 static int 3452 #ifdef __USE_PROTOS 3453 match_token(char *s, char **nxt) 3454 #else 3455 match_token(s,nxt) 3456 char *s; 3457 char **nxt; 3458 #endif 3459 { 3460 if ( !(*s>='A' && *s<='Z') ) return 0; 3461 s++; 3462 while ( (*s>='a' && *s<='z') || 3463 (*s>='A' && *s<='Z') || 3464 (*s>='0' && *s<='9') || 3465 *s=='_' ) 3466 { 3467 s++; 3468 } 3469 if ( *s!=' ' && *s!='}' ) return 0; 3470 *nxt = s; 3471 return 1; 3472 } 3473 3474 static int 3475 #ifdef __USE_PROTOS 3476 match_rexpr(char *s, char **nxt) 3477 #else 3478 match_rexpr(s,nxt) 3479 char *s; 3480 char **nxt; 3481 #endif 3482 { 3483 if ( *s!='"' ) return 0; 3484 s++; 3485 while ( *s!='"' ) 3486 { 3487 if ( *s=='\n' || *s=='\r' ) /* MR13 */ 3488 warn("eoln found in regular expression"); 3489 if ( *s=='\\' ) s++; 3490 s++; 3491 } 3492 *nxt = s+1; 3493 return 1; 3494 } 3495 3496 /* 3497 * Walk a string "{ A .. Z }" where A..Z is a space separated list 3498 * of token references (either labels or reg exprs). Return a 3499 * string "inlineX_set" for some unique integer X. Basically, 3500 * we pretend as if we had seen "#tokclass inlineX { A .. Z }" 3501 * on the input stream outside of an action. 3502 */ 3503 char * 3504 #ifdef __USE_PROTOS 3505 inline_set(char *s) 3506 #else 3507 inline_set(s) 3508 char *s; 3509 #endif 3510 { 3511 char *nxt; 3512 fprintf(stderr, "found consumeUntil( {...} )\n"); 3513 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} 3514 if ( *s!='{' ) 3515 { 3516 err("malformed consumeUntil( {...} ); missing '{'"); 3517 return "bad_set"; 3518 } 3519 s++; 3520 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} 3521 while ( *s!='}' ) 3522 { 3523 if ( match_token(s,&nxt) ) fprintf(stderr, "found token %s\n", s); 3524 else if ( match_rexpr(s,&nxt) ) fprintf(stderr, "found rexpr %s\n", s); 3525 else { 3526 err("invalid element in consumeUntil( {...} )"); 3527 return "bad_set"; 3528 } 3529 s = nxt; 3530 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;} 3531 } 3532 return "inlineX_set"; 3533 } 3534 3535 /* ANTLR-specific syntax error message generator 3536 * (define USER_ZZSYN when compiling so don't get 2 definitions) 3537 */ 3538 void 3539 #ifdef __USE_PROTOS 3540 zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, 3541 int k, char *bad_text) 3542 #else 3543 zzsyn(text, tok, egroup, eset, etok, k, bad_text) 3544 char *text, *egroup, *bad_text; 3545 int tok; 3546 int etok; 3547 int k; 3548 SetWordType *eset; 3549 #endif 3550 { 3551 fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline); 3552 fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text); 3553 if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} 3554 if ( k==1 ) fprintf(stderr, " missing"); 3555 else 3556 { 3557 fprintf(stderr, "; \"%s\" not", bad_text); 3558 if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); 3559 } 3560 if ( zzset_deg(eset)>0 ) zzedecode(eset); 3561 else fprintf(stderr, " %s", zztokens[etok]); 3562 if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup); 3563 fprintf(stderr, "\n"); 3564 } 3565