1 /* 2 * fset.c 3 * 4 * Compute FIRST and FOLLOW sets. 5 * 6 * SOFTWARE RIGHTS 7 * 8 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool 9 * Set (PCCTS) -- PCCTS is in the public domain. An individual or 10 * company may do whatever they wish with source code distributed with 11 * PCCTS or the code generated by PCCTS, including the incorporation of 12 * PCCTS, or its output, into commerical software. 13 * 14 * We encourage users to develop software with PCCTS. However, we do ask 15 * that credit is given to us for developing PCCTS. By "credit", 16 * we mean that if you incorporate our source code into one of your 17 * programs (commercial product, research project, or otherwise) that you 18 * acknowledge this fact somewhere in the documentation, research report, 19 * etc... If you like PCCTS and have developed a nice tool with the 20 * output, please mention that you developed it using PCCTS. In 21 * addition, we ask that this header remain intact in our source code. 22 * As long as these guidelines are kept, we expect to continue enhancing 23 * this system and expect to make other tools available as they are 24 * completed. 25 * 26 * ANTLR 1.33 27 * Terence Parr 28 * Parr Research Corporation 29 * with Purdue University and AHPCRC, University of Minnesota 30 * 1989-2001 31 */ 32 33 #include <stdio.h> 34 #include <stdlib.h> 35 36 #include "pcctscfg.h" 37 38 #include "set.h" 39 #include "syn.h" 40 #include "hash.h" 41 #include "generic.h" 42 #include "dlgdef.h" 43 #include "limits.h" 44 45 #ifdef __USE_PROTOS 46 static void ensure_predicates_cover_ambiguous_lookahead_sequences 47 (Junction *, Junction *, char *, Tree *); 48 #else 49 static void ensure_predicates_cover_ambiguous_lookahead_sequences(); 50 #endif 51 52 /* 53 * What tokens are k tokens away from junction q? 54 * 55 * Follow both p1 and p2 paths (unless RuleBlk) to collect the tokens k away from this 56 * node. 57 * We lock the junction according to k--the lookahead. If we have been at this 58 * junction before looking for the same, k, number of lookahead tokens, we will 59 * do it again and again...until we blow up the stack. Locks are only used on aLoopBlk, 60 * RuleBlk, aPlusBlk and EndRule junctions to remove/detect infinite recursion from 61 * FIRST and FOLLOW calcs. 62 * 63 * If p->jtype == EndRule we are going to attempt a FOLLOW. (FOLLOWs are really defined 64 * in terms of FIRST's, however). To proceed with the FOLLOW, p->halt cannot be 65 * set. p->halt is set to indicate that a reference to the current rule is in progress 66 * and the FOLLOW is not desirable. 67 * 68 * If we attempt a FOLLOW and find that there is no FOLLOW or REACHing beyond the EndRule 69 * junction yields an empty set, replace the empty set with EOF. No FOLLOW means that 70 * only EOF can follow the current rule. This normally occurs only on the start symbol 71 * since all other rules are referenced by another rule somewhere. 72 * 73 * Normally, both p1 and p2 are followed. However, checking p2 on a RuleBlk node is 74 * the same as checking the next rule which is clearly incorrect. 75 * 76 * Cycles in the FOLLOW sense are possible. e.g. Fo(c) requires Fo(b) which requires 77 * Fo(c). Both Fo(b) and Fo(c) are defined to be Fo(b) union Fo(c). Let's say 78 * Fo(c) is attempted first. It finds all of the FOLLOW symbols and then attempts 79 * to do Fo(b) which finds of its FOLLOW symbols. So, we have: 80 * 81 * Fo(c) 82 * / \ 83 * a set Fo(b) 84 * / \ 85 * a set Fo(c) .....Hmmmm..... Infinite recursion! 86 * 87 * The 2nd Fo(c) is not attempted and Fo(b) is left deficient, but Fo(c) is now 88 * correctly Fo(c) union Fo(b). We wish to pick up where we left off, so the fact 89 * that Fo(b) terminated early means that we lack Fo(c) in the Fo(b) set already 90 * laying around. SOOOOoooo, we track FOLLOW cycles. All FOLLOW computations are 91 * cached in a hash table. After the sequence of FOLLOWs finish, we reconcile all 92 * cycles --> correct all Fo(rule) sets in the cache. 93 * 94 * Confused? Good! Read my MS thesis [Purdue Technical Report TR90-30]. 95 * TJP 8/93 -- can now read PhD thesis from Purdue. 96 * 97 * Also, FIRST sets are cached in the hash table. Keys are (rulename,Fi/Fo,k). 98 * Only FIRST sets, for which the FOLLOW is not included, are stored. 99 * 100 * SPECIAL CASE of (...)+ blocks: 101 * I added an optional alt so that the alts could see what 102 * was behind the (...)+ block--thus using enough lookahead 103 * to branch out rather than just enough to distinguish 104 * between alts in the (...)+. However, when the FIRST("(...)+") is 105 * is needed, must not use this last "optional" alt. This routine 106 * turns off this path by setting a new 'ignore' flag for 107 * the alt and then resetting it afterwards. 108 */ 109 110 set 111 #ifdef __USE_PROTOS 112 rJunc( Junction *p, int k, set *rk ) 113 #else 114 rJunc( p, k, rk ) 115 Junction *p; 116 int k; 117 set *rk; 118 #endif 119 { 120 set a, b; 121 122 require(p!=NULL, "rJunc: NULL node"); 123 require(p->ntype==nJunction, "rJunc: not junction"); 124 125 #ifdef DBG_LL1 126 if ( p->jtype == RuleBlk ) fprintf(stderr, "FIRST(%s,%d) \n",((Junction *)p)->rname,k); 127 else fprintf(stderr, "rJunc: %s in rule %s\n", 128 decodeJType[p->jtype], ((Junction *)p)->rname); 129 #endif 130 /* if this is one of the added optional alts for (...)+ then return */ 131 132 /* no need to pop backtrace - hasn't been pushed */ 133 134 if ( p->ignore ) return empty; 135 136 if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); 137 138 /* MR14 */ if (AlphaBetaTrace && p->alpha_beta_guess_end) { 139 /* MR14 */ warnFL( 140 /* MR14 */ "not possible to compute follow set for alpha in an \"(alpha)? beta\" block. ", 141 /* MR14 */ FileStr[p->file],p->line); 142 /* MR14 */ MR_alphaBetaTraceReport(); 143 /* MR14 */ }; 144 145 /* MR14 */ if (p->alpha_beta_guess_end) { 146 /* MR14 */ if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 147 /* MR14 */ return empty; 148 /* MR14 */ } 149 150 /* locks are valid for aLoopBlk,aPlusBlk,RuleBlk,EndRule junctions only */ 151 if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || 152 p->jtype==aPlusBlk || p->jtype==EndRule ) 153 { 154 require(p->lock!=NULL, "rJunc: lock array is NULL"); 155 if ( p->lock[k] ) 156 { 157 if ( p->jtype == EndRule ) /* FOLLOW cycle? */ 158 { 159 #ifdef DBG_LL1 160 fprintf(stderr, "FOLLOW cycle to %s: panic!\n", p->rname); 161 #endif 162 if (! MR_AmbSourceSearch) RegisterCycle(p->rname, k); 163 } 164 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 165 return empty; 166 } 167 if ( p->jtype == RuleBlk && 168 p->end->halt && 169 ! MR_AmbSourceSearch) /* check for FIRST cache */ 170 { 171 CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'i',k)); 172 if ( q != NULL ) 173 { 174 set_orin(rk, q->rk); 175 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 176 return set_dup( q->fset ); 177 } 178 } 179 if ( p->jtype == EndRule && 180 !p->halt && /* MR11 was using cache even when halt set */ 181 ! MR_AmbSourceSearch) /* FOLLOW set cached already? */ 182 { 183 CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'o',k)); 184 if ( q != NULL ) 185 { 186 #ifdef DBG_LL1 187 fprintf(stderr, "cache for FOLLOW(%s,%d):", p->rname,k); 188 s_fprT(stderr, q->fset); 189 if ( q->incomplete ) fprintf(stderr, " (incomplete)"); 190 fprintf(stderr, "\n"); 191 #endif 192 if ( !q->incomplete ) 193 { 194 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 195 return set_dup( q->fset ); 196 } 197 } 198 } 199 p->lock[k] = TRUE; /* This rule is busy */ 200 } 201 202 a = b = empty; 203 204 if ( p->jtype == EndRule ) 205 { 206 if (p->halt ) /* don't want FOLLOW here? */ /* unless MR10 hoisting */ 207 { 208 p->lock[k] = FALSE; 209 set_orel(k, rk); /* indicate this k value needed */ 210 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 211 return empty; 212 } 213 if (! MR_AmbSourceSearch) FoPush(p->rname, k); /* Attempting FOLLOW */ 214 if ( p->p1 == NULL ) set_orel((TokenInd!=NULL?TokenInd[EofToken]:EofToken), &a);/* if no FOLLOW assume EOF */ 215 #ifdef DBG_LL1 216 fprintf(stderr, "-->FOLLOW(%s,%d)\n", p->rname,k); 217 #endif 218 } 219 220 if ( p->p1 != NULL ) { 221 /* MR14 */ if (p->guess) { 222 /* MR14 */ if (p->guess_analysis_point == NULL) { 223 /* MR14 */ Node * guess_point; 224 /* MR14 */ guess_point=(Node *)analysis_point(p); 225 /* MR14 */ if (guess_point == (Node *)p) { 226 /* MR14 */ guess_point=p->p1; 227 /* MR14 */ } 228 /* MR14 */ p->guess_analysis_point=guess_point; 229 /* MR14 */ } 230 /* MR14 */ REACH(p->guess_analysis_point, k, rk, a); 231 } else { 232 REACH(p->p1, k, rk, a); 233 } 234 } 235 236 /* C a c h e R e s u l t s */ 237 238 if ( p->jtype == RuleBlk && p->end->halt && ! MR_AmbSourceSearch) /* can save FIRST set? */ 239 { 240 CacheEntry *q = newCacheEntry( Fkey(p->rname,'i',k) ); 241 /*fprintf(stderr, "Caching %s FIRST %d\n", p->rname, k);*/ 242 hash_add(Fcache, Fkey(p->rname,'i',k), (Entry *)q); 243 q->fset = set_dup( a ); 244 q->rk = set_dup( *rk ); 245 } 246 247 if ( p->jtype == EndRule && 248 !p->halt && /* MR11 was using cache even with halt set */ 249 ! MR_AmbSourceSearch) /* just completed FOLLOW? */ 250 { 251 /* Cache Follow set */ 252 CacheEntry *q = (CacheEntry *) hash_get(Fcache, Fkey(p->rname,'o',k)); 253 if ( q==NULL ) 254 { 255 q = newCacheEntry( Fkey(p->rname,'o',k) ); 256 hash_add(Fcache, Fkey(p->rname,'o',k), (Entry *)q); 257 } 258 /*fprintf(stderr, "Caching %s FOLLOW %d\n", p->rname, k);*/ 259 if ( set_nil(a) && !q->incomplete ) 260 { 261 /* Don't ever save a nil set as complete. 262 * Turn it into an eof set. 263 */ 264 set_orel(EofToken, &a); 265 } 266 set_orin(&(q->fset), a); 267 FoPop( k ); 268 if ( FoTOS[k] == NULL && Cycles[k] != NULL ) ResolveFoCycles(k); 269 #ifdef DBG_LL1 270 fprintf(stderr, "saving FOLLOW(%s,%d):", p->rname, k); 271 s_fprT(stderr, q->fset); 272 if ( q->incomplete ) fprintf(stderr, " (incomplete)"); 273 fprintf(stderr, "\n"); 274 #endif 275 } 276 277 if (p->jtype != RuleBlk && p->p2 != NULL && /* MR14 */ ! p->guess) { 278 REACH(p->p2, k, rk, b); 279 } 280 281 if ( p->jtype==aLoopBlk || p->jtype==RuleBlk || 282 p->jtype==aPlusBlk || p->jtype==EndRule ) 283 p->lock[k] = FALSE; /* unlock node */ 284 285 set_orin(&a, b); 286 set_free(b); 287 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 288 return a; 289 } 290 291 set 292 #ifdef __USE_PROTOS 293 rRuleRef( RuleRefNode *p, int k, set *rk_out ) 294 #else 295 rRuleRef( p, k, rk_out ) 296 RuleRefNode *p; 297 int k; 298 set *rk_out; 299 #endif 300 { 301 set rk; 302 Junction *r; 303 int k2; 304 set a, rk2, b; 305 int save_halt; 306 RuleEntry *q = (RuleEntry *) hash_get(Rname, p->text); 307 require(p!=NULL, "rRuleRef: NULL node"); 308 require(p->ntype==nRuleRef, "rRuleRef: not rule ref"); 309 310 #ifdef DBG_LL1 311 fprintf(stderr, "rRuleRef: %s\n", p->text); 312 #endif 313 314 if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); 315 316 if ( q == NULL ) 317 { 318 warnFL( eMsg1("rule %s not defined",p->text), FileStr[p->file], p->line ); 319 REACH(p->next, k, rk_out, a); 320 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 321 return a; 322 } 323 rk2 = empty; 324 325 /* MR9 Problems with rule references in guarded predicates */ 326 /* MR9 Perhaps can use hash table to find rule ? */ 327 328 /* MR9 */ if (RulePtr == NULL) { 329 /* MR9 */ fatalFL(eMsg2("Rule %s uses rule %s via RulePtr before it has been initialized", 330 /* MR9 */ p->rname,q->str),FileStr[p->file],p->line); 331 /* MR9 */ }; 332 333 r = RulePtr[q->rulenum]; 334 if ( r->lock[k] ) 335 { 336 errNoFL( eMsg2("infinite left-recursion to rule %s from rule %s", 337 r->rname, p->rname) ); 338 339 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 340 341 return empty; 342 } 343 344 save_halt = r->end->halt; 345 r->end->halt = TRUE; /* don't let reach fall off end of rule here */ 346 rk = empty; 347 REACH(r, k, &rk, a); 348 r->end->halt = save_halt; 349 while ( !set_nil(rk) ) { 350 k2 = set_int(rk); /* MR11 this messes up the ambiguity search routine */ 351 set_rm(k2, rk); 352 REACH(p->next, k2, &rk2, b); /* MR11 by changing the value of k */ 353 set_orin(&a, b); 354 set_free(b); 355 } 356 set_free(rk); /* this has no members, but free it's memory */ 357 set_orin(rk_out, rk2); /* remember what we couldn't do */ 358 set_free(rk2); 359 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 360 return a; 361 } 362 363 /* 364 * Return FIRST sub k ( token_node ) 365 * 366 * TJP 10/11/93 modified this so that token nodes that are actually 367 * ranges (T1..T2) work. 368 */ 369 set 370 #ifdef __USE_PROTOS 371 rToken( TokNode *p, int k, set *rk ) 372 #else 373 rToken( p, k, rk ) 374 TokNode *p; 375 int k; 376 set *rk; 377 #endif 378 { 379 set a; 380 381 require(p!=NULL, "rToken: NULL node"); 382 require(p->ntype==nToken, "rToken: not token node"); 383 384 #ifdef DBG_LL1 385 fprintf(stderr, "rToken: %s\n", (TokenString(p->token)!=NULL)?TokenString(p->token): 386 ExprString(p->token)); 387 #endif 388 389 390 if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p); 391 392 if (MR_AmbSourceSearch && (k-1) == 0) { 393 394 set localConstrain; 395 set intersection; 396 397 localConstrain=fset[maxk-k+1]; 398 399 if (! set_nil(p->tset)) { 400 intersection=set_and(localConstrain,p->tset); 401 if (! set_nil(intersection)) { 402 MR_backTraceReport(); 403 }; 404 set_free(intersection); 405 } else { 406 if (set_el( (unsigned) p->token,localConstrain)) { 407 MR_backTraceReport(); 408 } 409 }; 410 }; 411 412 if ( k-1 == 0 ) { 413 414 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 415 416 if ( !set_nil(p->tset) ) { 417 return set_dup(p->tset); 418 } else { 419 return set_of(p->token); 420 }; 421 } 422 423 REACH(p->next, k-1, rk, a); 424 425 if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack); 426 427 return a; 428 } 429 430 set 431 #ifdef __USE_PROTOS 432 rAction( ActionNode *p, int k, set *rk ) 433 #else 434 rAction( p, k, rk ) 435 ActionNode *p; 436 int k; 437 set *rk; 438 #endif 439 { 440 set a; 441 442 require(p!=NULL, "rJunc: NULL node"); 443 require(p->ntype==nAction, "rJunc: not action"); 444 445 /* MR11 */ if (p->is_predicate && p->ampersandPred != NULL) { 446 /* MR11 */ Predicate *pred=p->ampersandPred; 447 /* MR11 */ if (k <= pred->k) { 448 /* MR11 */ REACH(p->guardNodes,k,rk,a); 449 /* MR11 */ return a; 450 /* MR11 */ }; 451 /* MR11 */ }; 452 453 /* it might be a good idea when doing an MR_AmbSourceSearch 454 to *not* look behind predicates under some circumstances 455 we'll look into that later 456 */ 457 458 REACH(p->next, k, rk, a); /* ignore actions */ 459 return a; 460 } 461 462 /* A m b i g u i t y R e s o l u t i o n */ 463 464 465 void 466 #ifdef __USE_PROTOS 467 dumpAmbigMsg( set *fset, FILE *f, int want_nls ) 468 #else 469 dumpAmbigMsg( fset, f, want_nls ) 470 set *fset; 471 FILE *f; 472 int want_nls; 473 #endif 474 { 475 int i; 476 477 set copy; /* MR11 */ 478 479 if ( want_nls ) fprintf(f, "\n\t"); 480 else fprintf(f, " "); 481 482 for (i=1; i<=CLL_k; i++) 483 { 484 copy=set_dup(fset[i]); /* MR11 */ 485 486 if ( i>1 ) 487 { 488 if ( !want_nls ) fprintf(f, ", "); 489 } 490 if ( set_deg(copy) > 3 && elevel == 1 ) 491 { 492 int e,m; 493 fprintf(f, "{"); 494 for (m=1; m<=3; m++) 495 { 496 e=set_int(copy); 497 fprintf(f, " %s", TerminalString(e)); 498 set_rm(e, copy); 499 } 500 fprintf(f, " ... }"); 501 } 502 else s_fprT(f, copy); 503 if ( want_nls ) fprintf(f, "\n\t"); 504 set_free(copy); 505 } 506 fprintf(f, "\n"); 507 508 } 509 510 static void 511 #ifdef __USE_PROTOS 512 verify_context(Predicate *predicate) 513 #else 514 verify_context(predicate) 515 Predicate *predicate; 516 #endif 517 { 518 if ( predicate == NULL ) return; 519 520 if ( predicate->expr == PRED_OR_LIST || 521 predicate->expr == PRED_AND_LIST ) 522 { 523 verify_context(predicate->down); 524 verify_context(predicate->right); /* MR10 */ 525 return; 526 } 527 528 if ( !predicate->source->ctxwarned && predicate->source->guardpred==NULL && 529 ((predicate->k > 1 && 530 !is_single_tuple(predicate->tcontext)) || 531 ( predicate->k == 1 && 532 set_deg(predicate->scontext[1])>1 )) ) 533 { 534 535 /* MR9 Suppress annoying messages caused by our own clever(?) fix */ 536 537 fprintf(stderr, ErrHdr, FileStr[predicate->source->file], 538 predicate->source->line); 539 fprintf(stderr, " warning: predicate applied for >1 lookahead %d-sequences\n", predicate->k); 540 fprintf(stderr, ErrHdr, FileStr[predicate->source->file], 541 predicate->source->line); 542 fprintf(stderr, " predicate text: \"%s\"\n", 543 (predicate->expr == NULL ? "(null)" : predicate->expr) ); 544 fprintf(stderr, ErrHdr, FileStr[predicate->source->file], 545 predicate->source->line); 546 fprintf(stderr, " You may only want one lookahead %d-sequence to apply\n", predicate->k); 547 fprintf(stderr, ErrHdr, FileStr[predicate->source->file], 548 predicate->source->line); 549 fprintf(stderr, " Try using a context guard '(...)? =>'\n"); 550 predicate->source->ctxwarned = 1; 551 } 552 verify_context(predicate->right); /* MR10 */ 553 } 554 555 /* 556 * If delta is the set of ambiguous lookahead sequences, then make sure that 557 * the predicate(s) for productions alt1,alt2 cover the sequences in delta. 558 * 559 * For example, 560 * a : <<PRED1>>? (A B|A C) 561 * | b 562 * ; 563 * b : <<PRED2>>? A B 564 * | A C 565 * ; 566 * 567 * This should give a warning that (A C) predicts both productions and alt2 568 * does not have a predicate in the production that generates (A C). 569 * 570 * The warning detection is simple. Let delta = LOOK(alt1) intersection LOOK(alt2). 571 * Now, if ( delta set-difference context(predicates-for-alt1) != empty then 572 * alt1 does not "cover" all ambiguous sequences. 573 * 574 * If ambig is nonempty, then ambig in LL(k) sense -> use tree info; else use fset 575 * info. Actually, sets are used only if k=1 for this grammar. 576 */ 577 static void 578 #ifdef __USE_PROTOS 579 ensure_predicates_cover_ambiguous_lookahead_sequences 580 ( Junction *alt1, Junction *alt2, char *sub, Tree *ambig ) 581 #else 582 ensure_predicates_cover_ambiguous_lookahead_sequences( alt1, alt2, sub, ambig ) 583 Junction *alt1; 584 Junction *alt2; 585 char *sub; 586 Tree *ambig; 587 #endif 588 { 589 if ( !ParseWithPredicates ) return; 590 591 if ( ambig!=NULL ) 592 { 593 Tree *non_covered = NULL; 594 if ( alt1->predicate!=NULL ) 595 non_covered = tdif(ambig, alt1->predicate, alt1->fset, alt2->fset); 596 if ( (non_covered!=NULL || alt1->predicate==NULL) && WarningLevel>1 ) 597 { 598 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 599 fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", 600 alt1->altnum, sub); 601 if ( alt1->predicate!=NULL && non_covered!=NULL ) 602 { 603 fprintf(stderr, " upon"); 604 preorder(non_covered); 605 } 606 else if ( alt1->predicate==NULL ) 607 { 608 fprintf(stderr, " upon"); 609 preorder(ambig->down); 610 } 611 fprintf(stderr, "\n"); 612 } 613 Tfree(non_covered); 614 non_covered = NULL; 615 if ( alt2->predicate!=NULL ) 616 non_covered = tdif(ambig, alt2->predicate, alt1->fset, alt2->fset); 617 if ( (non_covered!=NULL || alt2->predicate==NULL) && WarningLevel>1 ) 618 { 619 fprintf(stderr, ErrHdr, FileStr[alt2->file], alt2->line); 620 fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", 621 alt2->altnum, sub); 622 if ( alt2->predicate!=NULL && non_covered!=NULL ) 623 { 624 fprintf(stderr, " upon"); 625 preorder(non_covered); 626 } 627 else if ( alt2->predicate==NULL ) 628 { 629 fprintf(stderr, " upon"); 630 preorder(ambig->down); 631 } 632 fprintf(stderr, "\n"); 633 } 634 Tfree(non_covered); 635 } 636 else if ( !set_nil(alt1->fset[1]) ) 637 { 638 set delta, non_covered; 639 delta = set_and(alt1->fset[1], alt2->fset[1]); 640 non_covered = set_dif(delta, covered_set(alt1->predicate)); 641 if ( set_deg(non_covered)>0 && WarningLevel>1 ) 642 { 643 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 644 fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", 645 alt1->altnum, sub); 646 if ( alt1->predicate!=NULL ) 647 { 648 fprintf(stderr, " upon "); 649 s_fprT(stderr, non_covered); 650 } 651 fprintf(stderr, "\n"); 652 } 653 set_free( non_covered ); 654 non_covered = set_dif(delta, covered_set(alt2->predicate)); 655 if ( set_deg(non_covered)>0 && WarningLevel>1 ) 656 { 657 fprintf(stderr, ErrHdr, FileStr[alt2->file], alt2->line); 658 fprintf(stderr, " warning: alt %d %shas no predicate to resolve ambiguity", 659 alt2->altnum, sub); 660 if ( alt2->predicate!=NULL ) 661 { 662 fprintf(stderr, " upon "); 663 s_fprT(stderr, non_covered); 664 } 665 fprintf(stderr, "\n"); 666 } 667 set_free( non_covered ); 668 set_free( delta ); 669 } 670 else fatal_internal("productions have no lookahead in predicate checking routine"); 671 } 672 673 #ifdef __USE_PROTOS 674 void MR_doPredicatesHelp(int inGuessBlock,Junction *alt1,Junction *alt2,int jtype,char *sub) 675 #else 676 void MR_doPredicatesHelp(inGuessBlock,alt1,alt2,jtype,sub) 677 int inGuessBlock; 678 Junction *alt1; 679 Junction *alt2; 680 int jtype; 681 char *sub; 682 #endif 683 { 684 Predicate *p1; 685 Predicate *p2; 686 687 Junction *parentRule=MR_nameToRuleBlk(alt1->rname); 688 689 if (inGuessBlock && WarningLevel <= 1) return; 690 691 /* let antlr give the usual error message */ 692 693 if (alt1->predicate == NULL && alt2->predicate == NULL) return; 694 695 if ( (jtype == RuleBlk || jtype == aSubBlk) 696 && (alt1->predicate == NULL && alt2->predicate != NULL)) { 697 fprintf(stderr, ErrHdr, FileStr[parentRule->file],parentRule->line); 698 fprintf(stderr," warning: alt %d line %d and alt %d line %d of %s\n%s%s%s", 699 alt1->altnum, 700 alt1->line, 701 alt2->altnum, 702 alt2->line, 703 sub, 704 " These alts have ambig lookahead sequences resolved by a predicate for\n", 705 " the second choice. The second choice may not be reachable.\n", 706 " You may want to use a complementary predicate or rearrange the alts\n" 707 ); 708 return; 709 }; 710 711 /* first do the easy comparison. then do the hard one */ 712 713 if (MR_comparePredicates(alt1->predicate,alt2->predicate)) { 714 715 if (jtype == aLoopBegin || jtype == aPlusBlk ) { 716 717 /* I'm not sure this code is reachable. 718 Predicates following a (...)+ or (...)* block are probably 719 considered validation predicates and therefore not 720 participate in the predication expression 721 */ 722 723 fprintf(stderr, ErrHdr,FileStr[parentRule->file],parentRule->line); 724 fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s", 725 "the predicates used to disambiguate optional/exit paths of ", 726 sub, 727 CurRule, 728 FileStr[alt1->file], 729 alt1->altnum, 730 alt1->line, 731 alt2->altnum, 732 alt2->line, 733 " are identical and have no resolving power\n"); 734 } else { 735 fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); 736 fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s", 737 "the predicates used to disambiguate", 738 CurRule, 739 FileStr[alt1->file], 740 alt1->altnum, 741 alt1->line, 742 alt2->altnum, 743 alt2->line, 744 " are identical and have no resolving power\n"); 745 }; 746 } else { 747 p1=predicate_dup_without_context(alt1->predicate); 748 p1=MR_unfold(p1); 749 MR_clearPredEntry(p1); 750 MR_simplifyInverted(p1,0); 751 p1=MR_predSimplifyALL(p1); 752 p2=predicate_dup_without_context(alt2->predicate); 753 p2=MR_unfold(p2); 754 MR_clearPredEntry(p2); 755 MR_simplifyInverted(p2,0); 756 p2=MR_predSimplifyALL(p2); 757 if (MR_comparePredicates(p1,p2)) { 758 if (jtype == aLoopBegin || jtype == aPlusBlk ) { 759 fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); 760 fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", 761 "the predicates used to disambiguate optional/exit paths of ", 762 sub, 763 CurRule, 764 FileStr[alt1->file], 765 alt1->altnum, 766 alt1->line, 767 alt2->altnum, 768 alt2->line, 769 " are identical when compared without context and may have no\n", 770 " resolving power for some lookahead sequences.\n"); 771 } else { 772 fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); 773 fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", 774 "the predicates used to disambiguate", 775 CurRule, 776 FileStr[alt1->file], 777 alt1->altnum, 778 alt1->line, 779 alt2->altnum, 780 alt2->line, 781 " are identical when compared without context and may have no\n", 782 " resolving power for some lookahead sequences.\n"); 783 }; 784 if (InfoP) { 785 fprintf(output,"\n#if 0\n\n"); 786 fprintf(output,"The following predicates are identical when compared without\n"); 787 fprintf(output," lookahead context information. For some ambiguous lookahead\n"); 788 fprintf(output," sequences they may not have any power to resolve the ambiguity.\n"); 789 fprintf(output,"\n"); 790 791 fprintf(output,"Choice 1: %s alt %d line %d file %s\n\n", 792 MR_ruleNamePlusOffset( (Node *) alt1), 793 alt1->altnum, 794 alt1->line, 795 FileStr[alt1->file]); 796 fprintf(output," The original predicate for choice 1 with available context information:\n\n"); 797 MR_dumpPred1(2,alt1->predicate,1); 798 fprintf(output," The predicate for choice 1 after expansion (but without context information):\n\n"); 799 MR_dumpPred1(2,p1,0); 800 if (p1 == NULL) { 801 Predicate *phelp; 802 fprintf(output," The predicate for choice 1 after expansion (but before simplification)\n\n"); 803 phelp=predicate_dup_without_context(alt1->predicate); 804 phelp=MR_unfold(phelp); 805 MR_clearPredEntry(phelp); 806 MR_simplifyInverted(phelp,0); 807 phelp=MR_predSimplifyALLX(phelp,1); 808 MR_dumpPred1(2,phelp,0); 809 predicate_free(phelp); 810 }; 811 fprintf(output,"\n"); 812 813 fprintf(output,"Choice 2: %s alt %d line %d file %s\n\n", 814 MR_ruleNamePlusOffset( (Node *) alt2), 815 alt2->altnum, 816 alt2->line, 817 FileStr[alt2->file]); 818 fprintf(output," The original predicate for choice 2 with available context information:\n\n"); 819 MR_dumpPred1(1,alt2->predicate,1); 820 fprintf(output," The predicate for choice 2 after expansion (but without context information):\n\n"); 821 MR_dumpPred1(1,p2,0); 822 if (p2 == NULL) { 823 Predicate *phelp; 824 fprintf(output," The predicate for choice 2 after expansion (but before simplification)\n\n"); 825 phelp=predicate_dup_without_context(alt2->predicate); 826 phelp=MR_unfold(phelp); 827 MR_clearPredEntry(phelp); 828 MR_simplifyInverted(phelp,0); 829 phelp=MR_predSimplifyALLX(phelp,1); 830 MR_dumpPred1(2,phelp,0); 831 predicate_free(phelp); 832 }; 833 fprintf(output,"\n#endif\n"); 834 }; 835 } else if (MR_secondPredicateUnreachable(p1,p2)) { 836 if (jtype == aLoopBegin || jtype == aPlusBlk ) { 837 fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); 838 fprintf(stderr," warning: %s of %s in rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", 839 "the predicate used to disambiguate the first choice of the optional/exit paths of ", 840 sub, 841 CurRule, 842 FileStr[alt1->file], 843 alt1->altnum, 844 alt1->line, 845 alt2->altnum, 846 alt2->line, 847 " appears to \"cover\" the second predicate when compared without context.\n", 848 " The second predicate may have no resolving power for some lookahead sequences.\n"); 849 } else { 850 fprintf(stderr, ErrHdr, FileStr[parentRule->file], parentRule->line); 851 fprintf(stderr," warning: %s rule %s\n (file %s alt %d line %d and alt %d line %d)\n%s%s", 852 "the predicate used to disambiguate the first choice of", 853 CurRule, 854 FileStr[alt1->file], 855 alt1->altnum, 856 alt1->line, 857 alt2->altnum, 858 alt2->line, 859 " appears to \"cover\" the second predicate when compared without context.\n", 860 " The second predicate may have no resolving power for some lookahead sequences.\n"); 861 }; 862 if (InfoP) { 863 fprintf(output,"\n#if 0\n\n"); 864 fprintf(output,"The first predicate appears to \"cover\" the second predicate when they\n"); 865 fprintf(output," are compared without lookahead context information. For some ambiguous\n"); 866 fprintf(output," lookahead sequences the second predicate may not have any power to\n"); 867 fprintf(output," resolve the ambiguity.\n"); 868 fprintf(output,"\n"); 869 fprintf(output,"Choice 1: %s alt %d line %d file %s\n\n", 870 MR_ruleNamePlusOffset( (Node *) alt1), 871 alt1->altnum, 872 alt1->line, 873 FileStr[alt1->file]); 874 fprintf(output," The original predicate for choice 1 with available context information:\n\n"); 875 MR_dumpPred1(2,alt1->predicate,1); 876 fprintf(output," The predicate for choice 1 after expansion (but without context information):\n\n"); 877 MR_dumpPred1(2,p1,0); 878 if (p1 == NULL) { 879 Predicate *phelp; 880 fprintf(output," The predicate for choice 1 after expansion (but before simplification)\n\n"); 881 phelp=predicate_dup_without_context(alt1->predicate); 882 phelp=MR_unfold(phelp); 883 MR_clearPredEntry(phelp); 884 MR_simplifyInverted(phelp,0); 885 phelp=MR_predSimplifyALLX(phelp,1); 886 MR_dumpPred1(2,phelp,0); 887 predicate_free(phelp); 888 }; 889 fprintf(output,"\n"); 890 891 fprintf(output,"Choice 2: %s alt %d line %d file %s\n\n", 892 MR_ruleNamePlusOffset( (Node *) alt2), 893 alt2->altnum, 894 alt2->line, 895 FileStr[alt2->file]); 896 fprintf(output," The original predicate for choice 2 with available context information:\n\n"); 897 MR_dumpPred1(1,alt2->predicate,1); 898 fprintf(output," The predicate for choice 2 after expansion (but without context information):\n\n"); 899 MR_dumpPred1(1,p2,0); 900 if (p2 == NULL) { 901 Predicate *phelp; 902 fprintf(output," The predicate for choice 2 after expansion (but before simplification)\n\n"); 903 phelp=predicate_dup_without_context(alt2->predicate); 904 phelp=MR_unfold(phelp); 905 MR_clearPredEntry(phelp); 906 MR_simplifyInverted(phelp,0); 907 phelp=MR_predSimplifyALLX(phelp,1); 908 MR_dumpPred1(2,phelp,0); 909 predicate_free(phelp); 910 }; 911 fprintf(output,"\n#endif\n"); 912 }; 913 }; 914 predicate_free(p1); 915 predicate_free(p2); 916 }; 917 } 918 919 static int totalOverflow=0; /* MR9 */ 920 921 void 922 #ifdef __USE_PROTOS 923 HandleAmbiguity( Junction *block, Junction *alt1, Junction *alt2, int jtype ) 924 #else 925 HandleAmbiguity( block, alt1, alt2, jtype ) 926 Junction *block; 927 Junction *alt1; 928 Junction *alt2; 929 int jtype; 930 #endif 931 { 932 unsigned **ftbl; 933 set *fset, b; 934 int i, numAmbig,n2; 935 Tree *ambig=NULL, *t, *u; 936 char *sub = ""; 937 long n; 938 int thisOverflow=0; /* MR9 */ 939 long set_deg_value; /* MR10 */ 940 long threshhold; /* MR10 */ 941 942 require(block!=NULL, "NULL block"); 943 require(block->ntype==nJunction, "invalid block"); 944 945 /* These sets are used to constrain LL_k set, but are made CLL_k long anyway */ 946 fset = (set *) calloc(CLL_k+1, sizeof(set)); 947 require(fset!=NULL, "cannot allocate fset"); 948 ftbl = (unsigned **) calloc(CLL_k+1, sizeof(unsigned *)); 949 require(ftbl!=NULL, "cannot allocate ftbl"); 950 951 /* create constraint table and count number of possible ambiguities (use<=LL_k) */ 952 for (n=1,i=1; i<=CLL_k; i++) 953 { 954 b = set_and(alt1->fset[i], alt2->fset[i]); 955 /* MR9 */ set_deg_value = set_deg(b); 956 /* MR10 */ if (n > 0) { 957 /* MR10 */ threshhold = LONG_MAX / n; 958 /* MR10 */ if (set_deg_value <= threshhold) { 959 /* MR10 */ n *= set_deg_value; 960 /* MR10 */ } else { 961 /* MR10 */ n=LONG_MAX; 962 /* MR9 */ if (totalOverflow == 0) { 963 #if 0 964 /* MR10 comment this out because it just makes users worry */ 965 966 /* MR9 */ warnNoFL("Overflow in computing number of possible ambiguities in HandleAmbiguity\n"); 967 #endif 968 /* MR9 */ }; 969 /* MR9 */ thisOverflow++; 970 /* MR9 */ totalOverflow++; 971 /* MR9 */ }; 972 /* MR10 */ } else { 973 /* MR10 */ n *= set_deg_value; 974 /* MR9 */ }; 975 fset[i] = set_dup(b); 976 ftbl[i] = set_pdq(b); 977 set_free(b); 978 } 979 980 switch ( jtype ) 981 { 982 case aSubBlk: sub = "of (..) "; break; 983 case aOptBlk: sub = "of {..} "; break; 984 case aLoopBegin: sub = "of (..)* "; break; 985 case aLoopBlk: sub = "of (..)* "; break; 986 case aPlusBlk: sub = "of (..)+ "; break; 987 case RuleBlk: sub = "of the rule itself "; break; 988 default : sub = ""; break; 989 } 990 991 /* If the block is marked as a compressed lookahead only block, then 992 * simply return; ambiguity warning is given only at warning level 2. 993 */ 994 if ( block->approx>0 ) 995 { 996 if ( ParseWithPredicates ) 997 { 998 if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ 999 if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ 1000 1001 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1002 alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); 1003 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1004 require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); 1005 alt1->predicate=MR_predSimplifyALL(alt1->predicate); 1006 1007 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1008 alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); 1009 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1010 require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); 1011 alt2->predicate=MR_predSimplifyALL(alt2->predicate); 1012 1013 MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); 1014 1015 if ( HoistPredicateContext 1016 && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) 1017 { 1018 verify_context(alt1->predicate); 1019 verify_context(alt2->predicate); 1020 } 1021 1022 if ( HoistPredicateContext 1023 && (alt1->predicate!=NULL||alt2->predicate!=NULL) 1024 && WarningLevel>1 ) 1025 ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); 1026 } 1027 1028 if ( WarningLevel>1 ) 1029 { 1030 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 1031 if ( jtype == aLoopBegin || jtype == aPlusBlk ) 1032 fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); 1033 else 1034 fprintf(stderr, " warning(approx): alts %d and %d %sambiguous upon", 1035 alt1->altnum, alt2->altnum, sub); 1036 dumpAmbigMsg(fset, stderr, 0); 1037 MR_traceAmbSource(fset,alt1,alt2); 1038 } 1039 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1040 free((char *)fset); 1041 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1042 free((char *)ftbl); 1043 return; 1044 } 1045 1046 /* if all sets have degree 1 for k<LL_k, then must be ambig upon >=1 permutation; 1047 * don't bother doing full LL(k) analysis. 1048 * (This "if" block handles the LL(1) case) 1049 */ 1050 1051 n2 = 0; 1052 for (i=1; i<LL_k; i++) n2 += set_deg(alt1->fset[i])+set_deg(alt2->fset[i]); 1053 1054 /* here STARTS the special case in which the lookahead sets for alt1 and alt2 1055 all have degree 1 for k<LL_k (including LL_k=1) 1056 */ 1057 1058 if ( n2==2*(LL_k-1) ) 1059 { 1060 1061 /* TJP: added to fix the case where LL(1) and syntactic predicates didn't 1062 * work. It now recognizes syntactic predicates, but does not like combo: 1063 * LL(1)/syn/sem predicates. (10/24/93) 1064 */ 1065 1066 if ( first_item_is_guess_block_extra((Junction *)alt1->p1)!=NULL ) 1067 { 1068 if ( WarningLevel==1 ) 1069 { 1070 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1071 free((char *)fset); 1072 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1073 free((char *)ftbl); 1074 return; 1075 } 1076 1077 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 1078 if ( jtype == aLoopBegin || jtype == aPlusBlk ) 1079 fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); 1080 else 1081 fprintf(stderr, " warning: alts %d and %d %sambiguous upon", 1082 alt1->altnum, alt2->altnum, sub); 1083 dumpAmbigMsg(fset, stderr, 0); 1084 MR_traceAmbSource(fset,alt1,alt2); 1085 } 1086 1087 ambig = NULL; 1088 if ( LL_k>1 ) ambig = make_tree_from_sets(alt1->fset, alt2->fset); 1089 if ( ParseWithPredicates ) 1090 { 1091 if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ 1092 if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ 1093 1094 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1095 alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); 1096 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1097 require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); 1098 alt1->predicate=MR_predSimplifyALL(alt1->predicate); 1099 1100 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1101 alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); 1102 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1103 require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); 1104 alt2->predicate=MR_predSimplifyALL(alt2->predicate); 1105 1106 MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); 1107 1108 if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) 1109 { 1110 verify_context(alt1->predicate); 1111 verify_context(alt2->predicate); 1112 } 1113 if (HoistPredicateContext&&(alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1) 1114 ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); 1115 if ( WarningLevel == 1 && 1116 (alt1->predicate!=NULL||alt2->predicate!=NULL)) 1117 { 1118 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1119 free((char *)fset); 1120 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1121 free((char *)ftbl); 1122 Tfree(ambig); 1123 return; 1124 } 1125 } 1126 /* end TJP (10/24/93) */ 1127 1128 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 1129 if ( jtype == aLoopBegin || jtype == aPlusBlk ) 1130 fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); 1131 else 1132 fprintf(stderr, " warning: alts %d and %d %sambiguous upon", 1133 alt1->altnum, alt2->altnum, sub); 1134 if ( elevel == 3 && LL_k>1 ) 1135 { 1136 preorder(ambig); 1137 fprintf(stderr, "\n"); 1138 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1139 free((char *)fset); 1140 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1141 free((char *)ftbl); 1142 Tfree(ambig); 1143 return; 1144 }; 1145 1146 Tfree(ambig); 1147 dumpAmbigMsg(fset, stderr, 0); 1148 1149 /* because this is a special case in which both alt1 and alt2 have 1150 lookahead sets of degree 1 for k<LL_k (including k=1) the linear 1151 lookahead style search is adequate 1152 */ 1153 1154 MR_traceAmbSource(fset,alt1,alt2); 1155 1156 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1157 free((char *)fset); 1158 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1159 free((char *)ftbl); 1160 return; 1161 } 1162 1163 /* here ENDS the special case in which the lookahead sets for alt1 and alt2 1164 all have degree 1 for k<LL_k (including LL_k=1) 1165 */ 1166 1167 /* in case tree construction runs out of memory, set info to make good err msg */ 1168 1169 CurAmbigAlt1 = alt1->altnum; 1170 CurAmbigAlt2 = alt2->altnum; 1171 CurAmbigbtype = sub; 1172 CurAmbigfile = alt1->file; 1173 CurAmbigline = alt1->line; 1174 1175 /* Don't do full LL(n) analysis if (...)? block because the block, 1176 by definition, defies LL(n) analysis. 1177 If guess (...)? block and ambiguous then don't remove anything from 1178 2nd alt to resolve ambig. 1179 Want to predict with LL sup 1 ( n ) decision not LL(n) if guess block 1180 since it is much cheaper than LL(n). LL sup 1 ( n ) "covers" the LL(n) 1181 lookahead information. 1182 1183 Note: LL(n) context cannot be computed for semantic predicates when 1184 followed by (..)?. 1185 1186 If (..)? then we scream "AAAHHHH! No LL(n) analysis will help" 1187 1188 Is 'ambig' always defined if we enter this if? I hope so 1189 because the 'ensure...()' func references it. TJP Nov 1993. 1190 */ 1191 1192 /* THM MR30: Instead of using first_item_is_guss_block we use 1193 first_item_is_guess_block_extra which will look inside a 1194 loop block for a guess block. In other words ( (...)? )*. 1195 It there is an ambiguity in this circumstance then we suppress 1196 the normal methods of resolving ambiguities. 1197 */ 1198 1199 if ( first_item_is_guess_block_extra((Junction *)alt1->p1)!=NULL ) 1200 { 1201 if ( ParseWithPredicates ) 1202 { 1203 if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ 1204 if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ 1205 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1206 alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); 1207 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1208 require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); 1209 alt1->predicate=MR_predSimplifyALL(alt1->predicate); 1210 1211 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1212 alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); 1213 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1214 require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); 1215 alt2->predicate=MR_predSimplifyALL(alt2->predicate); 1216 1217 MR_doPredicatesHelp(1,alt1,alt2,jtype,sub); 1218 1219 if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) 1220 { 1221 verify_context(alt1->predicate); 1222 verify_context(alt2->predicate); 1223 } 1224 if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1 ) 1225 ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); 1226 if ( WarningLevel==1 && 1227 (alt1->predicate!=NULL||alt2->predicate!=NULL)) 1228 { 1229 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1230 free((char *)fset); 1231 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1232 free((char *)ftbl); 1233 return; 1234 } 1235 } 1236 1237 if ( WarningLevel>1 ) 1238 { 1239 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 1240 if ( jtype == aLoopBegin || jtype == aPlusBlk ) 1241 fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); 1242 else 1243 fprintf(stderr, " warning: alts %d and %d %sambiguous upon", 1244 alt1->altnum, alt2->altnum, sub); 1245 dumpAmbigMsg(fset, stderr, 0); 1246 MR_traceAmbSource(fset,alt1,alt2); 1247 } 1248 1249 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1250 free((char *)fset); 1251 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1252 free((char *)ftbl); 1253 return; 1254 } 1255 1256 /* Not resolved with (..)? block. Do full LL(n) analysis */ 1257 1258 /* ambig is the set of k-tuples truly in common between alt 1 and alt 2 */ 1259 /* MR11 VerifyAmbig once used fset destructively */ 1260 1261 ambig = VerifyAmbig(alt1, alt2, ftbl, fset, &t, &u, &numAmbig); 1262 1263 /* are all things in intersection really ambigs? */ 1264 1265 if (thisOverflow || numAmbig < n ) /* MR9 */ 1266 { 1267 Tree *v; 1268 1269 /* remove ambig permutation from 2nd alternative to resolve ambig; 1270 * We want to compute the set of artificial tuples, arising from 1271 * LL sup 1 (n) compression, that collide with real tuples from the 1272 * 2nd alternative. This is the set of "special case" tuples that 1273 * the LL sup 1 (n) decision template maps incorrectly. 1274 */ 1275 1276 /* when generating code in genExpr() it does 1277 * 1278 * if ( genExprSets(j->fset) && !genExprTree(j->ftree)) {... 1279 * 1280 * Sooooo the j->ftree is the tree of alt2 1281 * after removal of conflicts, not alt1 ! 1282 */ 1283 1284 if ( ambig!=NULL ) 1285 { 1286 /* at the top of ambig is an ALT node */ 1287 1288 for (v=ambig->down; v!=NULL; v=v->right) 1289 { 1290 u = trm_perm(u, v); /* remove v FROM u */ 1291 } 1292 /* fprintf(stderr, "after rm alt2:"); preorder(u); fprintf(stderr, "\n");*/ 1293 } 1294 Tfree( t ); 1295 alt1->ftree = tappend(alt1->ftree, u); 1296 alt1->ftree = tleft_factor(alt1->ftree); 1297 } 1298 1299 if ( ambig==NULL ) 1300 { 1301 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1302 free((char *)fset); 1303 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1304 free((char *)ftbl); 1305 return; 1306 } 1307 1308 ambig = tleft_factor(ambig); 1309 1310 /* TJP: 1311 * At this point, we surely have an LL(k) ambiguity. Check for predicates 1312 */ 1313 if ( ParseWithPredicates ) 1314 { 1315 if (alt1->predicate != NULL) predicate_free(alt1->predicate); /* MR12 */ 1316 if (alt2->predicate != NULL) predicate_free(alt2->predicate); /* MR12 */ 1317 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1318 alt1->predicate = MR_find_predicates_and_supp((Node *)alt1->p1); 1319 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1320 require (MR_predicate_context_completed(alt1->predicate),"predicate alt 1 not completed"); 1321 alt1->predicate=MR_predSimplifyALL(alt1->predicate); 1322 1323 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1324 alt2->predicate = MR_find_predicates_and_supp((Node *)alt2->p1); 1325 require(MR_PredRuleRefStack.count == 0,"PredRuleRef stack not empty"); 1326 require (MR_predicate_context_completed(alt2->predicate),"predicate alt 2 not completed"); 1327 alt2->predicate=MR_predSimplifyALL(alt2->predicate); 1328 1329 MR_doPredicatesHelp(0,alt1,alt2,jtype,sub); 1330 1331 if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) ) 1332 { 1333 verify_context(alt1->predicate); 1334 verify_context(alt2->predicate); 1335 } 1336 if ( HoistPredicateContext && (alt1->predicate!=NULL||alt2->predicate!=NULL) && WarningLevel>1 ) 1337 ensure_predicates_cover_ambiguous_lookahead_sequences(alt1, alt2, sub, ambig); 1338 if ( WarningLevel==1 && 1339 (alt1->predicate!=NULL||alt2->predicate!=NULL)) 1340 { 1341 1342 /* We found at least one pred for at least one of the alts; 1343 * If warnings are low, just return. 1344 */ 1345 1346 Tfree(ambig); 1347 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1348 free((char *)fset); 1349 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1350 free((char *)ftbl); 1351 return; 1352 } 1353 /* else we're gonna give a warning */ 1354 } 1355 /* end TJP addition */ 1356 1357 fprintf(stderr, ErrHdr, FileStr[alt1->file], alt1->line); 1358 if ( jtype == aLoopBegin || jtype == aPlusBlk ) 1359 fprintf(stderr, " warning: optional/exit path and alt(s) %sambiguous upon", sub); 1360 else 1361 fprintf(stderr, " warning: alts %d and %d %sambiguous upon", 1362 alt1->altnum, alt2->altnum, sub); 1363 if ( elevel == 3 ) 1364 { 1365 preorder(ambig->down); /* <===== k>1 ambiguity message data */ 1366 fprintf(stderr, "\n"); 1367 } else { 1368 MR_skipped_e3_report=1; 1369 dumpAmbigMsg(fset, stderr, 0); 1370 }; 1371 1372 MR_traceAmbSourceK(ambig,alt1,alt2); /* <====== k>1 ambiguity aid */ 1373 1374 Tfree(ambig); 1375 1376 for (i=1; i<=CLL_k; i++) set_free( fset[i] ); 1377 free((char *)fset); 1378 for (i=1; i<=CLL_k; i++) free( (char *)ftbl[i] ); 1379 free((char *)ftbl); 1380 } 1381 1382 /* Don't analyze alpha block of (alpha)?beta; if (alpha)? then analyze 1383 * Return the 1st node of the beta block if present else return j. 1384 */ 1385 Junction * 1386 #ifdef __USE_PROTOS 1387 analysis_point( Junction *j ) 1388 #else 1389 analysis_point( j ) 1390 Junction *j; 1391 #endif 1392 { 1393 Junction *gblock; 1394 1395 /* MR13b When there was an action/predicate preceding a guess block 1396 the guess block became invisible at the analysis_point. 1397 1398 first_item_is_guess_block accepts any kind of node, 1399 despite the fact that the formal is a junction. But 1400 I don't want to have to change it all over the place 1401 until I know it works. 1402 */ 1403 1404 if ( j->ntype != nJunction && j->ntype != nAction) return j; 1405 1406 gblock = first_item_is_guess_block((Junction *)j); 1407 1408 if ( gblock!=NULL ) 1409 { 1410 Junction *past = gblock->end; 1411 Junction *p; 1412 require(past!=NULL, "analysis_point: no end block on (...)? block"); 1413 1414 for (p=(Junction *)past->p1; p!=NULL; ) 1415 { 1416 if ( p->ntype==nAction ) 1417 { 1418 p=(Junction *)((ActionNode *)p)->next; 1419 continue; 1420 } 1421 if ( p->ntype!=nJunction ) 1422 { 1423 past->alpha_beta_guess_end=1; /* MR14 */ 1424 return (Junction *)past->p1; 1425 } 1426 if ( p->jtype==EndBlk || p->jtype==EndRule ) 1427 { 1428 return j; 1429 } 1430 /* MR6 */ 1431 /* MR6 A guess block is of the form "(alpha)? beta" or "(alpha)?". */ 1432 /* MR6 When beta is omitted (second form) this means "(alpha)? alpha". */ 1433 /* MR6 The program does not store another copy of alpha in this case. */ 1434 /* MR6 During analysis when the program needs to know what follows the */ 1435 /* MR6 guess clause. It calls this routine. */ 1436 /* MR6 */ 1437 /* MR6 If it is of the form "(alpha)? beta" it returns a pointer to beta.*/ 1438 /* MR6 */ 1439 /* MR6 If it is of the form "(alpha)?" it returns a pointer to the guess */ 1440 /* MR6 block itself thereby reusing the junction tree. */ 1441 /* MR6 */ 1442 /* MR6 It works by searching the "next in sequence" chain (skipping actions) */ 1443 /* MR6 searching for a RuleRef or Token node. (Those are the only 4 kinds */ 1444 /* MR6 of nodes: Junctions, RuleRef, Token, and Action.) */ 1445 /* MR6 */ 1446 /* MR6 This won't work for the special case "(alpha)? ()" because it has no */ 1447 /* MR6 rule references or token nodes. It eventually encounters a */ 1448 /* MR6 junction of type EndBlk or EndRule and says to its caller: nothing */ 1449 /* MR6 more here to analyze - must be of the form "(alpha)?". */ 1450 /* MR6 */ 1451 /* MR6 In the case of "(alpha)? ()" it should return a pointer to "()" */ 1452 /* MR6 */ 1453 /* MR6 I think. */ 1454 /* MR6 */ 1455 if ( p->jtype!=Generic) { /* MR6 */ 1456 past->alpha_beta_guess_end=1; /* MR14 */ 1457 return (Junction *)past->p1; /* MR6 */ 1458 }; /* MR6 */ 1459 p=(Junction *)p->p1; 1460 } 1461 } 1462 return j; 1463 } 1464 1465 set 1466 #ifdef __USE_PROTOS 1467 First( Junction *j, int k, int jtype, int *max_k ) 1468 #else 1469 First( j, k, jtype, max_k ) 1470 Junction *j; 1471 int k; 1472 int jtype; 1473 int *max_k; 1474 #endif 1475 { 1476 Junction *alt1, *alt2; 1477 set a, rk, fCurBlk; 1478 int savek; 1479 int p1, p2; 1480 1481 int save_maintainBackTrace; 1482 1483 require(j->ntype==nJunction, "First: non junction passed"); 1484 1485 /* C o m p u t e F I R S T s e t w i t h k l o o k a h e a d */ 1486 fCurBlk = rk = empty; 1487 for (alt1=j; alt1!=NULL; alt1 = (Junction *)alt1->p2 ) 1488 { 1489 Junction * p = NULL; 1490 Junction * p1junction = NULL; 1491 p = analysis_point((Junction *)alt1->p1); 1492 p1junction = (Junction *) (alt1->p1); 1493 #if 0 1494 if (p != p1junction) { 1495 fprintf(stdout,"Analysis point for #%d is #%d", p1junction->seq, p->seq); /* debug */ 1496 } 1497 #endif 1498 REACH(p, k, &rk, alt1->fset[k]); 1499 require(set_nil(rk), "rk != nil"); 1500 set_free(rk); 1501 set_orin(&fCurBlk, alt1->fset[k]); 1502 } 1503 1504 /* D e t e c t A m b i g u i t i e s */ 1505 *max_k = 1; 1506 for (p1=1,alt1=j; alt1!=NULL; alt1 = (Junction *)alt1->p2, p1++) 1507 { 1508 for (p2=1,alt2=(Junction *)alt1->p2; alt2!=NULL; alt2 = (Junction *)alt2->p2, p2++) 1509 { 1510 savek = k; 1511 a = set_and(alt1->fset[k], alt2->fset[k]); 1512 while ( !set_nil(a) ) 1513 { 1514 /* if we have hit the max k requested, just give warning */ 1515 if ( j->approx==k ) { 1516 } 1517 1518 if ( k==CLL_k ) 1519 { 1520 #ifdef NOT_USED 1521 *** int save_LL_k = LL_k; 1522 *** int save_CLL_k = CLL_k; 1523 *** /* Get new LL_k from interactive feature if enabled */ 1524 *** if ( AImode ) 1525 *** AmbiguityDialog(j, jtype, alt1, alt2, &CLL_k, &LL_k); 1526 #endif 1527 *max_k = CLL_k; 1528 save_maintainBackTrace=MR_MaintainBackTrace; 1529 if (AlphaBetaTrace) MR_MaintainBackTrace=0; 1530 HandleAmbiguity(j, alt1, alt2, jtype); 1531 MR_MaintainBackTrace=save_maintainBackTrace; 1532 break; 1533 } 1534 else 1535 { 1536 Junction *p = analysis_point((Junction *)alt1->p1); 1537 Junction *q = analysis_point((Junction *)alt2->p1); 1538 k++; /* attempt ambig alts again with more lookahead */ 1539 1540 REACH(p, k, &rk, alt1->fset[k]); 1541 require(set_nil(rk), "rk != nil"); 1542 REACH(q, k, &rk, alt2->fset[k]); 1543 require(set_nil(rk), "rk != nil"); 1544 set_free(a); 1545 a = set_and(alt1->fset[k], alt2->fset[k]); 1546 if ( k > *max_k ) *max_k = k; 1547 } 1548 } 1549 set_free(a); 1550 k = savek; 1551 } 1552 } 1553 1554 return fCurBlk; 1555 } 1556