fset2.c
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:55k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * fset2.c
  3.  *
  4.  * Compute FIRST sets for full LL(k)
  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-1998
  31.  */
  32. #include <stdio.h>
  33. #ifdef __cplusplus
  34. #ifndef __STDC__
  35. #define __STDC__
  36. #endif
  37. #endif
  38. #ifdef __STDC__
  39. #include <stdarg.h>
  40. #else
  41. #include <varargs.h>
  42. #endif
  43. #include "set.h"
  44. #include "syn.h"
  45. #include "hash.h"
  46. #include "generic.h"
  47. #include "dlgdef.h"
  48. extern char tokens[];
  49. extern char *PRED_AND_LIST;
  50. extern char *PRED_OR_LIST;
  51. /* ick! globals.  Used by permute() to track which elements of a set have been used */
  52. static int *findex;
  53. set *fset;              /* MR11 make global */
  54. static unsigned **ftbl;
  55. static set *constrain; /* pts into fset. constrains tToken() to 'constrain' */
  56. int ConstrainSearch;
  57. int maxk;               /* set to initial k upon tree construction request */
  58.                         /* MR11 make global */
  59. static Tree *FreeList = NULL;
  60. #ifdef __STDC__
  61. static int tmember_of_context(Tree *, Predicate *);
  62. #else
  63. static int tmember_of_context();
  64. #endif
  65. #if TREE_DEBUG
  66. set     set_of_tnodes_in_use;
  67. int     stop_on_tnode_seq_number=(-1);     /* (-1) to disable */
  68. #endif
  69. /* Do root
  70.  * Then each sibling
  71.  */
  72. void
  73. #ifdef __STDC__
  74. preorder( Tree *tree )
  75. #else
  76. preorder( tree )
  77. Tree *tree;
  78. #endif
  79. {
  80. if ( tree == NULL ) return;
  81. if ( tree->down != NULL ) fprintf(stderr, " (");
  82. if ( tree->token == ALT ) fprintf(stderr, " ALT");
  83. else fprintf(stderr, " %s", TerminalString(tree->token));
  84. if ( tree->token==EpToken ) fprintf(stderr, "(%d)", tree->v.rk);
  85. preorder(tree->down);
  86. if ( tree->down != NULL ) fprintf(stderr, " )");
  87. preorder(tree->right);
  88. }
  89. #ifdef __STDC__
  90. int MR_tree_matches_constraints(int k,set * constrain,Tree *t)
  91. #else
  92. int MR_tree_matches_constraints(k,constrain,t)
  93.   int       k;
  94.   set *     constrain;
  95.   Tree *    t;
  96. #endif
  97. {
  98.   int       i;
  99.   Tree      *u;
  100.   if (k == 0) return 1;
  101.   /* for testing guard predicates: if the guard tree is shorter
  102.      than the constraint then it is a match.  The reason is that
  103.      a guard of (A B) should be equivalent to a guard of (A B . . .)
  104.      where "." matches every token.  Thus a match which runs out
  105.      of tree before constraint is a match.
  106.   */
  107.   if (t == NULL) return 1;
  108.   require (set_deg(constrain[0]) == 1,
  109.             "MR_tree_matches_constraints: set_deg != 1");
  110.   i=set_int(constrain[0]);
  111.   if (t->token != i) return 0;
  112.   if (k-1 == 0) return 1;
  113.   for (u=t->down; u != NULL; u=u->right) {
  114.     if (MR_tree_matches_constraints(k-1,&constrain[1],u)) {
  115.        return 1;
  116.     };
  117.   };
  118.   return 0;
  119. }
  120. /* check the depth of each primary sibling to see that it is exactly
  121.  * k deep. e.g.;
  122.  *
  123.  * ALT
  124.  *   |
  125.  *   A ------- B
  126.  *   |         |
  127.  *   C -- D    E
  128.  *
  129.  * Remove all branches <= k deep.
  130.  *
  131.  * Added by TJP 9-23-92 to make the LL(k) constraint mechanism to work.
  132.  */
  133. static int pruneCount=0;
  134. static int prunePeak=200;
  135. Tree *
  136. #ifdef __STDC__
  137. prune( Tree *t, int k )
  138. #else
  139. prune( t, k )
  140. Tree *t;
  141. int k;
  142. #endif
  143. {
  144.     pruneCount++;
  145.     if (pruneCount > prunePeak+100) {
  146.       prunePeak=pruneCount;
  147. #if 0
  148. ***   fprintf(stderr,"pruneCount=%dn",pruneCount);
  149. /***  preorder(t);   ***/
  150. ***   fprintf(stderr,"n",pruneCount);
  151. #endif
  152.     };
  153.     if ( t == NULL ) {
  154.         pruneCount--;
  155.         return NULL;
  156.     };
  157.     if ( t->token == ALT ) fatal_internal("prune: ALT node in FIRST tree");
  158.     if ( t->right!=NULL ) t->right = prune(t->right, k);
  159.     if ( k>1 )
  160. {
  161. if ( t->down!=NULL ) t->down = prune(t->down, k-1);
  162. if ( t->down == NULL )
  163. {
  164. Tree *r = t->right;
  165. t->right = NULL;
  166. Tfree(t);
  167.             pruneCount--;
  168. return r;
  169. }
  170. }
  171.     pruneCount--;
  172.     return t;
  173. }
  174. /* build a tree (root child1 child2 ... NULL) */
  175. #ifdef __STDC__
  176. Tree *tmake(Tree *root, ...)
  177. #else
  178. Tree *tmake(va_alist)
  179. va_dcl
  180. #endif
  181. {
  182. Tree *w;
  183. va_list ap;
  184. Tree *child, *sibling=NULL, *tail=NULL;
  185. #ifndef __STDC__
  186. Tree *root;
  187. #endif
  188. #ifdef __STDC__
  189. va_start(ap, root);
  190. #else
  191. va_start(ap);
  192. root = va_arg(ap, Tree *);
  193. #endif
  194. child = va_arg(ap, Tree *);
  195. while ( child != NULL )
  196. {
  197. #ifdef DUM
  198. /* added "find end of child" thing TJP March 1994 */
  199. for (w=child; w->right!=NULL; w=w->right) {;} /* find end of child */
  200. #else
  201. w = child;
  202. #endif
  203. if ( sibling == NULL ) {sibling = child; tail = w;}
  204. else {tail->right = child; tail = w;}
  205. child = va_arg(ap, Tree *);
  206. }
  207. /* was "root->down = sibling;" */
  208. if ( root==NULL ) root = sibling;
  209. else root->down = sibling;
  210. va_end(ap);
  211. return root;
  212. }
  213. Tree *
  214. #ifdef __STDC__
  215. tnode( int tok )
  216. #else
  217. tnode( tok )
  218. int tok;
  219. #endif
  220. {
  221. Tree *p, *newblk;
  222. static int n=0;
  223. if ( FreeList == NULL )
  224. {
  225. /*fprintf(stderr, "tnode: %d more nodesn", TreeBlockAllocSize);*/
  226. if ( TreeResourceLimit > 0 )
  227. {
  228. if ( (n+TreeBlockAllocSize) >= TreeResourceLimit )
  229. {
  230. fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline);
  231. fprintf(stderr, " hit analysis resource limit while analyzing alts %d and %d %sn",
  232. CurAmbigAlt1,
  233. CurAmbigAlt2,
  234. CurAmbigbtype);
  235. exit(PCCTS_EXIT_FAILURE);
  236. }
  237. }
  238. newblk = (Tree *)calloc(TreeBlockAllocSize, sizeof(Tree));
  239. if ( newblk == NULL )
  240. {
  241. fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline);
  242. fprintf(stderr, " out of memory while analyzing alts %d and %d %sn",
  243. CurAmbigAlt1,
  244. CurAmbigAlt2,
  245. CurAmbigbtype);
  246. exit(PCCTS_EXIT_FAILURE);
  247. }
  248. n += TreeBlockAllocSize;
  249. for (p=newblk; p<&(newblk[TreeBlockAllocSize]); p++)
  250. {
  251. p->right = FreeList; /* add all new Tree nodes to Free List */
  252. FreeList = p;
  253. }
  254. }
  255. p = FreeList;
  256. FreeList = FreeList->right; /* remove a tree node */
  257. p->right = NULL; /* zero out ptrs */
  258. p->down = NULL;
  259. p->token = tok;
  260.     TnodesAllocated++;                                      /* MR10 */
  261.     TnodesInUse++;                                          /* MR10 */
  262.     if (TnodesInUse > TnodesPeak) TnodesPeak=TnodesInUse;   /* MR10 */
  263. #ifdef TREE_DEBUG
  264. require(!p->in_use, "tnode: node in use!");
  265. p->in_use = 1;
  266.     p->seq=TnodesAllocated;
  267.     set_orel( (unsigned) TnodesAllocated,&set_of_tnodes_in_use);
  268.     if (stop_on_tnode_seq_number == p->seq) {
  269.       fprintf(stderr,"n*** just allocated tnode #%d ***n",
  270.             stop_on_tnode_seq_number);
  271.     };
  272. #endif
  273. return p;
  274. }
  275. static Tree *
  276. #ifdef __STDC__
  277. eofnode( int k )
  278. #else
  279. eofnode( k )
  280. int k;
  281. #endif
  282. {
  283. Tree *t=NULL;
  284. int i;
  285. for (i=1; i<=k; i++)
  286. {
  287. t = tmake(tnode((TokenInd!=NULL?TokenInd[EofToken]:EofToken)), t, NULL);
  288. }
  289. return t;
  290. }
  291. void
  292. #ifdef __STDC__
  293. _Tfree( Tree *t )
  294. #else
  295. _Tfree( t )
  296. Tree *t;
  297. #endif
  298. {
  299. if ( t!=NULL )
  300. {
  301. #ifdef TREE_DEBUG
  302.         if (t->seq == stop_on_tnode_seq_number) {
  303.            fprintf(stderr,"n*** just freed tnode #%d ***n",t->seq);
  304.         };
  305. require(t->in_use, "_Tfree: node not in use!");
  306. t->in_use = 0;
  307.         set_rm( (unsigned) t->seq,set_of_tnodes_in_use);
  308. #endif
  309. t->right = FreeList;
  310. FreeList = t;
  311.         TnodesInUse--;                   /* MR10 */
  312. }
  313. }
  314. /* tree duplicate */
  315. Tree *
  316. #ifdef __STDC__
  317. tdup( Tree *t )
  318. #else
  319. tdup( t )
  320. Tree *t;
  321. #endif
  322. {
  323. Tree *u;
  324. if ( t == NULL ) return NULL;
  325. u = tnode(t->token);
  326. u->v.rk = t->v.rk;
  327. u->right = tdup(t->right);
  328. u->down = tdup(t->down);
  329. return u;
  330. }
  331. /* tree duplicate (assume tree is a chain downwards) */
  332. Tree *
  333. #ifdef __STDC__
  334. tdup_chain( Tree *t )
  335. #else
  336. tdup_chain( t )
  337. Tree *t;
  338. #endif
  339. {
  340. Tree *u;
  341. if ( t == NULL ) return NULL;
  342. u = tnode(t->token);
  343. u->v.rk = t->v.rk;
  344. u->down = tdup(t->down);
  345. return u;
  346. }
  347. Tree *
  348. #ifdef __STDC__
  349. tappend( Tree *t, Tree *u )
  350. #else
  351. tappend( t, u )
  352. Tree *t;
  353. Tree *u;
  354. #endif
  355. {
  356. Tree *w;
  357. /*** fprintf(stderr, "tappend(");
  358.  *** preorder(t); fprintf(stderr, ",");
  359.  *** preorder(u); fprintf(stderr, " )n");
  360. */
  361. if ( t == NULL ) return u;
  362. if ( t->token == ALT && t->right == NULL ) return tappend(t->down, u);
  363. for (w=t; w->right!=NULL; w=w->right) {;}
  364. w->right = u;
  365. return t;
  366. }
  367. /* dealloc all nodes in a tree */
  368. void
  369. #ifdef __STDC__
  370. Tfree( Tree *t )
  371. #else
  372. Tfree( t )
  373. Tree *t;
  374. #endif
  375. {
  376. if ( t == NULL ) return;
  377. Tfree( t->down );
  378. Tfree( t->right );
  379. _Tfree( t );
  380. }
  381. /* find all children (alts) of t that require remaining_k nodes to be LL_k
  382.  * tokens long.
  383.  *
  384.  * t-->o
  385.  *     |
  386.  *     a1--a2--...--an <-- LL(1) tokens
  387.  *     |   |        |
  388.  *     b1  b2  ...  bn <-- LL(2) tokens
  389.  *     |   |        |
  390.  *     .   .        .
  391.  *     .   .        .
  392.  *     z1  z2  ...  zn <-- LL(LL_k) tokens
  393.  *
  394.  * We look for all [Ep] needing remaining_k nodes and replace with u.
  395.  * u is not destroyed or actually used by the tree (a copy is made).
  396.  */
  397. Tree *
  398. #ifdef __STDC__
  399. tlink( Tree *t, Tree *u, int remaining_k )
  400. #else
  401. tlink( t, u, remaining_k )
  402. Tree *t;
  403. Tree *u;
  404. int remaining_k;
  405. #endif
  406. {
  407. Tree *p;
  408. require(remaining_k!=0, "tlink: bad tree");
  409. if ( t==NULL ) return NULL;
  410. /*fprintf(stderr, "tlink: u is:"); preorder(u); fprintf(stderr, "n");*/
  411. if ( t->token == EpToken && t->v.rk == remaining_k )
  412. {
  413. require(t->down==NULL, "tlink: invalid tree");
  414. if ( u == NULL ) {
  415. /* MR10 */  Tree  *tt=t->right;
  416. /* MR10 */  _Tfree(t);
  417. /* MR10 */  return tt;
  418.         };
  419. p = tdup( u );
  420. p->right = t->right;
  421. _Tfree( t );
  422. return p;
  423. }
  424. t->down = tlink(t->down, u, remaining_k);
  425. t->right = tlink(t->right, u, remaining_k);
  426. return t;
  427. }
  428. /* remove as many ALT nodes as possible while still maintaining semantics */
  429. Tree *
  430. #ifdef __STDC__
  431. tshrink( Tree *t )
  432. #else
  433. tshrink( t )
  434. Tree *t;
  435. #endif
  436. {
  437. if ( t == NULL ) return NULL;
  438. t->down = tshrink( t->down );
  439. t->right = tshrink( t->right );
  440. if ( t->down == NULL )
  441. {
  442. if ( t->token == ALT )
  443. {
  444. Tree *u = t->right;
  445. _Tfree(t);
  446. return u; /* remove useless alts */
  447. }
  448. return t;
  449. }
  450. /* (? (ALT (? ...)) s) ==> (? (? ...) s) where s = sibling, ? = match any */
  451. if ( t->token == ALT && t->down->right == NULL)
  452. {
  453. Tree *u = t->down;
  454. u->right = t->right;
  455. _Tfree( t );
  456. return u;
  457. }
  458. /* (? (A (ALT t)) s) ==> (? (A t) s) where A is a token; s,t siblings */
  459. if ( t->token != ALT && t->down->token == ALT && t->down->right == NULL )
  460. {
  461. Tree *u = t->down->down;
  462. _Tfree( t->down );
  463. t->down = u;
  464. return t;
  465. }
  466. return t;
  467. }
  468. Tree *
  469. #ifdef __STDC__
  470. tflatten( Tree *t )
  471. #else
  472. tflatten( t )
  473. Tree *t;
  474. #endif
  475. {
  476. if ( t == NULL ) return NULL;
  477. t->down = tflatten( t->down );
  478. t->right = tflatten( t->right );
  479. if ( t->down == NULL ) return t;
  480. if ( t->token == ALT )
  481. {
  482. Tree *u;
  483. /* find tail of children */
  484. for (u=t->down; u->right!=NULL; u=u->right) {;}
  485. u->right = t->right;
  486. u = t->down;
  487. _Tfree( t );
  488. return u;
  489. }
  490. return t;
  491. }
  492. Tree *
  493. #ifdef __STDC__
  494. tJunc( Junction *p, int k, set *rk )
  495. #else
  496. tJunc( p, k, rk )
  497. Junction *p;
  498. int k;
  499. set *rk;
  500. #endif
  501. {
  502. Tree *t=NULL, *u=NULL;
  503. Junction *alt;
  504. Tree *tail=NULL, *r;
  505. #ifdef DBG_TRAV
  506. fprintf(stderr, "tJunc(%d): %s in rule %sn", k,
  507. decodeJType[p->jtype], ((Junction *)p)->rname);
  508. #endif
  509. /* MR14 */    if (AlphaBetaTrace && p->alpha_beta_guess_end) {
  510. /* MR14 */         warnFL(
  511. /* MR14 */           "not possible to compute follow set for alpha in an "(alpha)? beta" block.  ",
  512. /* MR14 */                 FileStr[p->file],p->line);
  513. /* MR14 */         MR_alphaBetaTraceReport();
  514. /* MR14 */    };
  515. /* MR14 */    if (p->alpha_beta_guess_end) {
  516. /* MR14 */      return NULL;
  517. /* MR14 */    }
  518. if ( p->jtype==aLoopBlk || p->jtype==RuleBlk ||
  519.  p->jtype==aPlusBlk || p->jtype==aSubBlk || p->jtype==aOptBlk )
  520. {
  521. if ( p->jtype!=aSubBlk && p->jtype!=aOptBlk ) {
  522. require(p->lock!=NULL, "rJunc: lock array is NULL");
  523. if ( p->lock[k] ) return NULL;
  524. p->lock[k] = TRUE;
  525. }
  526. /* MR10 */    if (MR_MaintainBackTrace) {
  527. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p);
  528. /* MR10 */    };
  529. TRAV(p->p1, k, rk, tail);
  530. /* MR10 */    if (MR_MaintainBackTrace) {
  531. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack);
  532. /* MR10 */    };
  533. if ( p->jtype==RuleBlk ) {p->lock[k] = FALSE; return tail;}
  534. r = tmake(tnode(ALT), tail, NULL);
  535. for (alt=(Junction *)p->p2; alt!=NULL; alt = (Junction *)alt->p2)
  536. {
  537. /* if this is one of the added optional alts for (...)+ then break */
  538. if ( alt->ignore ) break;
  539. if ( tail==NULL ) {TRAV(alt->p1, k, rk, tail); r->down = tail;}
  540. else
  541. {
  542. /* MR10 */    if (MR_MaintainBackTrace) {
  543. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p);
  544. /* MR10 */    };
  545. TRAV(alt->p1, k, rk, tail->right);
  546. /* MR10 */    if (MR_MaintainBackTrace) {
  547. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack);
  548. /* MR10 */    };
  549. if ( tail->right != NULL ) tail = tail->right;
  550. }
  551. }
  552. if ( p->jtype!=aSubBlk && p->jtype!=aOptBlk ) p->lock[k] = FALSE;
  553. #ifdef DBG_TREES
  554. fprintf(stderr, "blk(%s) returns:",((Junction *)p)->rname); preorder(r); fprintf(stderr, "n");
  555. #endif
  556. if ( r->down == NULL ) {_Tfree(r); return NULL;}
  557. return r;
  558. }
  559. if ( p->jtype==EndRule )
  560. {
  561. if ( p->halt ) /* don't want FOLLOW here? */
  562. {
  563. /**** if ( ContextGuardTRAV ) return NULL; ****/
  564. set_orel( (unsigned) k, rk); /* indicate this k value needed */ /* MR10 cast */
  565. t = tnode(EpToken);
  566. t->v.rk = k;
  567. return t;
  568. }
  569. require(p->lock!=NULL, "rJunc: lock array is NULL");
  570. if ( p->lock[k] ) return NULL;
  571. /* if no FOLLOW assume k EOF's */
  572. if ( p->p1 == NULL ) return eofnode(k);
  573. p->lock[k] = TRUE;
  574. }
  575. /* MR14 */ if (p->p1 != NULL && p->guess &&  p->guess_analysis_point == NULL) {
  576. /* MR14 */    Node * guess_point;
  577. /* MR14 */    guess_point=(Node *)analysis_point(p);
  578. /* MR14 */    if (guess_point == (Node *)p) {
  579. /* MR14 */      guess_point=p->p1;
  580. /* MR14 */    }
  581. /* MR14 */    p->guess_analysis_point=guess_point;
  582. /* MR14 */  }
  583. if ( p->p2 == NULL )
  584. {
  585. /* MR10 */    if (MR_MaintainBackTrace) {
  586. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p);
  587. /* MR10 */    };
  588. /* M14 */        if (p->guess_analysis_point != NULL) {
  589. /* M14 */     TRAV(p->guess_analysis_point, k, rk,t);
  590. /* M14 */        } else {
  591.             TRAV(p->p1, k, rk,t);
  592. /* M14 */        }
  593. /* MR10 */    if (MR_MaintainBackTrace) {
  594. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack);
  595. /* MR10 */    };
  596. if ( p->jtype==EndRule ) p->lock[k]=FALSE;
  597. return t;
  598. }
  599. /* MR10 */    if (MR_MaintainBackTrace) {
  600. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPush(&MR_BackTraceStack,p);
  601. /* MR10 */    };
  602. /* M14 */        if (p->guess_analysis_point != NULL) {
  603. /* M14 */     TRAV(p->guess_analysis_point, k, rk,t);
  604. /* M14 */        } else {
  605.             TRAV(p->p1, k, rk,t);
  606. /* M14 */        }
  607. /* MR10 */    if (MR_MaintainBackTrace) {
  608. /* MR10 */      if (p->jtype != Generic) MR_pointerStackPop(&MR_BackTraceStack);
  609. /* MR10 */    };
  610. if ( p->jtype!=RuleBlk && /* MR14 */ !p->guess) TRAV(p->p2, k, rk, u);
  611. if ( p->jtype==EndRule ) p->lock[k] = FALSE;/* unlock node */
  612. if ( t==NULL ) return tmake(tnode(ALT), u, NULL);
  613. return tmake(tnode(ALT), t, u, NULL);
  614. }
  615. Tree *
  616. #ifdef __STDC__
  617. tRuleRef( RuleRefNode *p, int k, set *rk_out )
  618. #else
  619. tRuleRef( p, k, rk_out )
  620. RuleRefNode *p;
  621. int k;
  622. set *rk_out;
  623. #endif
  624. {
  625. int k2;
  626. Tree *t=NULL, *u=NULL;
  627. Junction *r;
  628. set rk, rk2;
  629. int save_halt;
  630. RuleEntry *q = (RuleEntry *) hash_get(Rname, p->text);
  631. #ifdef DBG_TRAV
  632. fprintf(stderr, "tRuleRef: %sn", p->text);
  633. #endif
  634. if ( q == NULL )
  635. {
  636. TRAV(p->next, k, rk_out, t);/* ignore undefined rules */
  637. return t;
  638. }
  639. rk = rk2 = empty;
  640.     if (RulePtr == NULL) fatal("RulePtr==NULL");
  641. r = RulePtr[q->rulenum];
  642. if ( r->lock[k] ) return NULL;
  643. save_halt = r->end->halt;
  644. r->end->halt = TRUE; /* don't let reach fall off end of rule here */
  645. /* MR10 */    if (MR_MaintainBackTrace) {
  646. /* MR10 */      MR_pointerStackPush(&MR_BackTraceStack,p);
  647. /* MR10 */    };
  648. TRAV(r, k, &rk, t);
  649. /* MR10 */    if (MR_MaintainBackTrace) {
  650. /* MR10 */      MR_pointerStackPop(&MR_BackTraceStack);
  651. /* MR10 */    };
  652. r->end->halt = save_halt;
  653. #ifdef DBG_TREES
  654. fprintf(stderr, "after ruleref, t is:"); preorder(t); fprintf(stderr, "n");
  655. #endif
  656. t = tshrink( t );
  657. while ( !set_nil(rk) ) { /* any k left to do? if so, link onto tree */
  658. k2 = set_int(rk);
  659. set_rm(k2, rk);
  660. /* MR10 */    if (MR_MaintainBackTrace) {
  661. /* MR10 */      MR_pointerStackPush(&MR_BackTraceStack,p);
  662. /* MR10 */    };
  663. TRAV(p->next, k2, &rk2, u);
  664. /* MR10 */    if (MR_MaintainBackTrace) {
  665. /* MR10 */      MR_pointerStackPop(&MR_BackTraceStack);
  666. /* MR10 */    };
  667. t = tlink(t, u, k2); /* any alts missing k2 toks, add u onto end */
  668.         Tfree(u);               /* MR10 */
  669. }
  670. set_free(rk); /* rk is empty, but free it's memory */
  671. set_orin(rk_out, rk2); /* remember what we couldn't do */
  672. set_free(rk2);
  673. return t;
  674. }
  675. Tree *
  676. #ifdef __STDC__
  677. tToken( TokNode *p, int k, set *rk )
  678. #else
  679. tToken( p, k, rk )
  680. TokNode *p;
  681. int k;
  682. set *rk;
  683. #endif
  684. {
  685. Tree *t=NULL, *tset=NULL, *u;
  686. if (ConstrainSearch) {
  687.       if (MR_AmbSourceSearch) {
  688. require(constrain>=fset&&constrain<=&(fset[CLL_k]),"tToken: constrain is not a valid set");
  689.       } else {
  690. require(constrain>=fset&&constrain<=&(fset[LL_k]),"tToken: constrain is not a valid set");
  691.       };
  692.       constrain = &fset[maxk-k+1];
  693. }
  694. #ifdef DBG_TRAV
  695.          fprintf(stderr, "tToken(%d): %sn", k, TerminalString(p->token));
  696.          if ( ConstrainSearch ) {
  697.          fprintf(stderr, "constrain is:"); s_fprT(stderr, *constrain); fprintf(stderr, "n");
  698.          }
  699. #endif
  700. /* is it a meta token (set of tokens)? */
  701. if ( !set_nil(p->tset) )
  702. {
  703. unsigned e=0;
  704. set a;
  705. Tree *n, *tail = NULL;
  706. if ( ConstrainSearch ) {
  707.           a = set_and(p->tset, *constrain);
  708.           if (set_nil(a)) {         /* MR10 */
  709.             set_free(a);            /* MR11 */
  710.             return NULL;            /* MR10 */
  711.           };                        /* MR10 */
  712. } else {
  713.           a = set_dup(p->tset);
  714.         };
  715. for (; !set_nil(a); set_rm(e, a))
  716. {
  717. e = set_int(a);
  718. n = tnode(e);
  719. if ( tset==NULL ) { tset = n; tail = n; }
  720. else { tail->right = n; tail = n; }
  721. }
  722. set_free( a );
  723. }
  724. else if ( ConstrainSearch && !set_el(p->token, *constrain) )
  725.     {
  726. /*      fprintf(stderr, "ignoring token %s(%d)n", TerminalString(p->token),
  727.                 k);*/
  728.         return NULL;
  729.     }
  730. else {
  731.         tset = tnode( p->token );
  732.     };
  733. /* MR10 */    if (MR_MaintainBackTrace) {
  734. /* MR10 */      if (k == 1) {
  735. /* MR10 */        MR_pointerStackPush(&MR_BackTraceStack,p);
  736. /* MR13 */        if (MR_SuppressSearch) {
  737. /* MR13 */          MR_suppressSearchReport();
  738. /* MR13 */        } else {
  739. /* MR10 */          MR_backTraceReport();
  740. /* MR13 */        };
  741. /* MR10 */        MR_pointerStackPop(&MR_BackTraceStack);
  742. /* MR11 */        Tfree(tset);
  743. /* MR11 */        return NULL;
  744. /* MR10 */      };
  745. /* MR10 */    };
  746. if ( k == 1 ) return tset;
  747.     if (MR_MaintainBackTrace) {
  748.       MR_pointerStackPush(&MR_BackTraceStack,p);
  749.     };
  750. TRAV(p->next, k-1, rk, t);
  751.     if (MR_MaintainBackTrace) {
  752.       Tfree(t);
  753.       Tfree(tset);
  754.       MR_pointerStackPop(&MR_BackTraceStack);
  755.       return NULL;
  756.     };
  757. /* here, we are positive that, at least, this tree will not contribute
  758.  * to the LL(2) tree since it will be too shallow, IF t==NULL.
  759.  * If doing a context guard walk, then don't prune.
  760.  */
  761. if ( t == NULL && !ContextGuardTRAV ) /* tree will be too shallow */
  762. {
  763. if ( tset!=NULL ) Tfree( tset );
  764. return NULL;
  765. }
  766. #ifdef DBG_TREES
  767. fprintf(stderr, "tToken(%d)->next:",k); preorder(t); fprintf(stderr, "n");
  768. #endif
  769. /* if single token root, then just make new tree and return */
  770.     /* MR10 - set_nil(p->tset) isn't a good test because of ConstraintSearch */
  771. if (tset->right == NULL) return tmake(tset, t, NULL);    /* MR10 */
  772. /* here we must make a copy of t as a child of each element of the tset;
  773.  * e.g., "T1..T3 A" would yield ( nil ( T1 A ) ( T2 A ) ( T3 A ) )
  774.  */
  775. for (u=tset; u!=NULL; u=u->right)
  776. {
  777. /* make a copy of t and hook it onto bottom of u */
  778. u->down = tdup(t);
  779. }
  780. Tfree( t );
  781. #ifdef DBG_TREES
  782. fprintf(stderr, "range is:"); preorder(tset); fprintf(stderr, "n");
  783. #endif
  784. return tset;
  785. }
  786. Tree *
  787. #ifdef __STDC__
  788. tAction( ActionNode *p, int k, set *rk )
  789. #else
  790. tAction( p, k, rk )
  791. ActionNode *p;
  792. int k;
  793. set *rk;
  794. #endif
  795. {
  796. Tree        *t=NULL;
  797.     set         *save_fset=NULL;
  798.     int         i;
  799. /* fprintf(stderr, "tActionn"); */
  800. /*  An MR_SuppressSearch is looking for things that can be
  801.       reached even when the predicate is false.
  802.     There are three kinds of predicates:
  803.         plain:              r1: <<p>>? r2
  804.         guarded:            r1: (A)? => <<p>>? r2
  805.         ampersand style:    r1: (A)? && <<p>>? r2
  806.     Of the three kinds of predicates, only a guard predicate
  807.       has things which are reachable even when the predicate
  808.       is false.  To be reachable the constraint must *not*
  809.       match the guard.
  810. */
  811.     if (p->is_predicate && MR_SuppressSearch) {
  812.       Predicate     *pred=p->guardpred;
  813.       if (pred == NULL) {
  814.         t=NULL;
  815.         goto EXIT;
  816.       };
  817.       constrain = &fset[maxk-k+1];
  818.       if (pred->k == 1) {
  819.         set     dif;
  820.         dif=set_dif(*constrain,pred->scontext[1]);
  821.         if (set_nil(dif)) {
  822.           set_free(dif);
  823.           t=NULL;
  824.           goto EXIT;
  825.         };
  826.         set_free(dif);
  827.       } else {
  828.         if (MR_tree_matches_constraints(k,constrain,pred->tcontext)) {
  829.           t=NULL;
  830.           goto EXIT;
  831.         };
  832.       }
  833.     };
  834.     /* The ampersand predicate differs from the
  835.          other predicates because its first set
  836.          is a subset of the first set behind the predicate
  837.             r1: (A)? && <<p>>? r2 ;
  838.             r2: A | B;
  839.        In this case first[1] of r1 is A, even
  840.          though first[1] of r2 is {A B}.
  841.     */
  842.     if (p->is_predicate && p->ampersandPred != NULL) {
  843.       Predicate     *pred=p->ampersandPred;
  844.       Tree          *tAND;
  845.       Tree          *tset;
  846.       if (k <= pred->k) {
  847.         if (MR_MaintainBackTrace) MR_pointerStackPush(&MR_BackTraceStack,p);
  848.         TRAV(p->guardNodes,k,rk,t);
  849.         if (MR_MaintainBackTrace) MR_pointerStackPop(&MR_BackTraceStack);
  850.         return t;
  851.       } else {
  852.         require (k>1,"tAction for ampersandpred: k <= 1");
  853.         if (ConstrainSearch) {
  854.           if (MR_AmbSourceSearch) {
  855.      require(constrain>=fset&&constrain<=&(fset[CLL_k]),
  856.                                 "tToken: constrain is not a valid set");
  857.           } else {
  858.      require(constrain>=fset&&constrain<=&(fset[LL_k]),
  859.                                 "tToken: constrain is not a valid set");
  860.           };
  861.           save_fset=(set *) calloc (CLL_k+1,sizeof(set));
  862.           require (save_fset != NULL,"tAction save_fset alloc");
  863.           for (i=1; i <= CLL_k ; i++) {
  864.             save_fset[i]=set_dup(fset[i]);
  865.           };
  866.           if (pred->k == 1) {
  867.             constrain = &fset[maxk-k+1];
  868.             set_andin(constrain,pred->scontext[1]);
  869.             if (set_nil(*constrain)) {
  870.               t=NULL;
  871.               goto EXIT;
  872.             };
  873.           } else {
  874.             constrain = &fset[maxk-k+1];
  875.             if (! MR_tree_matches_constraints(pred->k,constrain,pred->tcontext)) {
  876.                t=NULL;
  877.                goto EXIT;
  878.             };  /* end loop on i          */
  879.           }; /* end loop on pred scontext/tcontext */
  880.         }; /* end if on k > pred->k     */
  881.       }; /* end if on constrain search  */
  882.       TRAV(p->next,k,rk,t);
  883.       if (t != NULL) {
  884.         t=tshrink(t);
  885.         t=tflatten(t);
  886.         t=tleft_factor(t);
  887.         if (pred->tcontext != NULL) {
  888.           tAND=MR_computeTreeAND(t,pred->tcontext);
  889.         } else {
  890.           tset=MR_make_tree_from_set(pred->scontext[1]);
  891.           tAND=MR_computeTreeAND(t,tset);
  892.           Tfree(tset);
  893.         };
  894.         Tfree(t);
  895.         t=tAND;
  896.       };
  897.       goto EXIT;
  898.     }; /* end if on ampersand predicate */
  899.     TRAV(p->next,k,rk,t);
  900. EXIT:
  901.     if (save_fset != NULL) {
  902.       for (i=1 ; i <= CLL_k ; i++) {
  903.         set_free(fset[i]);
  904.         fset[i]=save_fset[i];
  905.       };
  906.       free ( (char *) save_fset);
  907.     };
  908. return t;
  909. }
  910. /* see if e exists in s as a possible input permutation (e is always a chain) */
  911. int
  912. #ifdef __STDC__
  913. tmember( Tree *e, Tree *s )
  914. #else
  915. tmember( e, s )
  916. Tree *e;
  917. Tree *s;
  918. #endif
  919. {
  920. if ( e==NULL||s==NULL ) return 0;
  921. /** fprintf(stderr, "tmember(");
  922. *** preorder(e); fprintf(stderr, ",");
  923. *** preorder(s); fprintf(stderr, " )n");
  924. */
  925. if ( s->token == ALT && s->right == NULL ) return tmember(e, s->down);
  926. if ( e->token!=s->token )
  927. {
  928. if ( s->right==NULL ) return 0;
  929. return tmember(e, s->right);
  930. }
  931. if ( e->down==NULL && s->down == NULL ) return 1;
  932. if ( tmember(e->down, s->down) ) return 1;
  933. if ( s->right==NULL ) return 0;
  934. return tmember(e, s->right);
  935. }
  936. /* see if e exists in s as a possible input permutation (e is always a chain);
  937.  * Only check s to the depth of e.  In other words, 'e' can be a shorter
  938.  * sequence than s.
  939.  */
  940. int
  941. #ifdef __STDC__
  942. tmember_constrained( Tree *e, Tree *s)
  943. #else
  944. tmember_constrained( e, s )
  945. Tree *e;
  946. Tree *s;
  947. #endif
  948. {
  949. if ( e==NULL||s==NULL ) return 0;
  950. /** fprintf(stderr, "tmember_constrained(");
  951. *** preorder(e); fprintf(stderr, ",");
  952. *** preorder(s); fprintf(stderr, " )n");
  953. **/
  954. if ( s->token == ALT && s->right == NULL )
  955. return tmember_constrained(e, s->down);
  956. if ( e->token!=s->token )
  957. {
  958. if ( s->right==NULL ) return 0;
  959. return tmember_constrained(e, s->right);
  960. }
  961. if ( e->down == NULL ) return 1; /* if s is matched to depth of e return */
  962. if ( tmember_constrained(e->down, s->down) ) return 1;
  963. if ( s->right==NULL ) return 0;
  964. return tmember_constrained(e, s->right);
  965. }
  966. /* combine (? (A t) ... (A u) ...) into (? (A t u)) */
  967. Tree *
  968. #ifdef __STDC__
  969. tleft_factor( Tree *t )
  970. #else
  971. tleft_factor( t )
  972. Tree *t;
  973. #endif
  974. {
  975. Tree *u, *v, *trail, *w;
  976. /* left-factor what is at this level */
  977. if ( t == NULL ) return NULL;
  978. for (u=t; u!=NULL; u=u->right)
  979. {
  980. trail = u;
  981. v=u->right;
  982. while ( v!=NULL )
  983. {
  984. if ( u->token == v->token )
  985. {
  986. if ( u->down!=NULL )
  987. {
  988. for (w=u->down; w->right!=NULL; w=w->right) {;}
  989. w->right = v->down; /* link children together */
  990. }
  991. else u->down = v->down;
  992. trail->right = v->right; /* unlink factored node */
  993. _Tfree( v );
  994. v = trail->right;
  995. }
  996. else {trail = v; v=v->right;}
  997. }
  998. }
  999. /* left-factor what is below */
  1000. for (u=t; u!=NULL; u=u->right) u->down = tleft_factor( u->down );
  1001. return t;
  1002. }
  1003. /* remove the permutation p from t if present */
  1004. Tree *
  1005. #ifdef __STDC__
  1006. trm_perm( Tree *t, Tree *p )
  1007. #else
  1008. trm_perm( t, p )
  1009. Tree *t;
  1010. Tree *p;
  1011. #endif
  1012. {
  1013. /*
  1014. fprintf(stderr, "trm_perm(");
  1015. preorder(t); fprintf(stderr, ",");
  1016. preorder(p); fprintf(stderr, " )n");
  1017. */
  1018. if ( t == NULL || p == NULL ) return NULL;
  1019. if ( t->token == ALT )
  1020. {
  1021. t->down = trm_perm(t->down, p);
  1022. if ( t->down == NULL )  /* nothing left below, rm cur node */
  1023. {
  1024. Tree *u = t->right;
  1025. _Tfree( t );
  1026. return trm_perm(u, p);
  1027. }
  1028. t->right = trm_perm(t->right, p); /* look for more instances of p */
  1029. return t;
  1030. }
  1031. if ( p->token != t->token ) /* not found, try a sibling */
  1032. {
  1033. t->right = trm_perm(t->right, p);
  1034. return t;
  1035. }
  1036. t->down = trm_perm(t->down, p->down);
  1037. if ( t->down == NULL )  /* nothing left below, rm cur node */
  1038. {
  1039. Tree *u = t->right;
  1040. _Tfree( t );
  1041. return trm_perm(u, p);
  1042. }
  1043. t->right = trm_perm(t->right, p); /* look for more instances of p */
  1044. return t;
  1045. }
  1046. /* add the permutation 'perm' to the LL_k sets in 'fset' */
  1047. void
  1048. #ifdef __STDC__
  1049. tcvt( set *fset, Tree *perm )
  1050. #else
  1051. tcvt( fset, perm )
  1052. set *fset;
  1053. Tree *perm;
  1054. #endif
  1055. {
  1056. if ( perm==NULL ) return;
  1057. set_orel(perm->token, fset);
  1058. tcvt(fset+1, perm->down);
  1059. }
  1060. /* for each element of ftbl[k], make it the root of a tree with permute(ftbl[k+1])
  1061.  * as a child.
  1062.  */
  1063. Tree *
  1064. #ifdef __STDC__
  1065. permute( int k, int max_k )
  1066. #else
  1067. permute( k, max_k )
  1068. int k, max_k;
  1069. #endif
  1070. {
  1071. Tree *t, *u;
  1072. if ( k>max_k ) return NULL;
  1073. if ( ftbl[k][findex[k]] == nil ) return NULL;
  1074. t = permute(k+1, max_k);
  1075. if ( t==NULL&&k<max_k ) /* no permutation left below for k+1 tokens? */
  1076. {
  1077. findex[k+1] = 0;
  1078. (findex[k])++; /* try next token at this k */
  1079. return permute(k, max_k);
  1080. }
  1081. u = tmake(tnode(ftbl[k][findex[k]]), t, NULL);
  1082. if ( k == max_k ) (findex[k])++;
  1083. return u;
  1084. }
  1085. /* Compute LL(k) trees for alts alt1 and alt2 of p.
  1086.  * function result is tree of ambiguous input permutations
  1087.  *
  1088.  * ALGORITHM may change to look for something other than LL_k size
  1089.  * trees ==> maxk will have to change.
  1090.  */
  1091. Tree *
  1092. #ifdef __STDC__
  1093. VerifyAmbig( Junction *alt1, Junction *alt2, unsigned **ft, set *fs, Tree **t, Tree **u, int *numAmbig )
  1094. #else
  1095. VerifyAmbig( alt1, alt2, ft, fs, t, u, numAmbig )
  1096. Junction *alt1;
  1097. Junction *alt2;
  1098. unsigned **ft;
  1099. set *fs;
  1100. Tree **t;
  1101. Tree **u;
  1102. int *numAmbig;
  1103. #endif
  1104. {
  1105. set rk;
  1106. Tree *perm, *ambig=NULL;
  1107. Junction *p;
  1108. int k;
  1109.     int    tnodes_at_start=TnodesAllocated;
  1110.     int    tnodes_at_end;
  1111.     int    tnodes_used;
  1112.     set    *save_fs;
  1113.     int    j;
  1114.     save_fs=(set *) calloc(CLL_k+1,sizeof(set));
  1115.     require(save_fs != NULL,"save_fs calloc");
  1116.     for (j=0; j <= CLL_k ; j++) save_fs[j]=set_dup(fs[j]);
  1117. maxk = LL_k; /* NOTE: for now, we look for LL_k */
  1118. ftbl = ft;
  1119. fset = fs;
  1120. constrain = &(fset[1]);
  1121. findex = (int *) calloc(LL_k+1, sizeof(int));
  1122. if ( findex == NULL )
  1123. {
  1124. fprintf(stderr, ErrHdr, FileStr[CurAmbigfile], CurAmbigline);
  1125. fprintf(stderr, " out of memory while analyzing alts %d and %d of %sn",
  1126. CurAmbigAlt1,
  1127. CurAmbigAlt2,
  1128. CurAmbigbtype);
  1129. exit(PCCTS_EXIT_FAILURE);
  1130. }
  1131. for (k=1; k<=LL_k; k++) findex[k] = 0;
  1132. rk = empty;
  1133. ConstrainSearch = 1; /* consider only tokens in ambig sets */
  1134. p = analysis_point((Junction *)alt1->p1);
  1135. TRAV(p, LL_k, &rk, *t);
  1136. *t = tshrink( *t );
  1137. *t = tflatten( *t );
  1138. *t = tleft_factor( *t );    /* MR10 */
  1139. *t = prune(*t, LL_k);
  1140. *t = tleft_factor( *t );
  1141. /*** fprintf(stderr, "after shrink&flatten&prune&left_factor:"); preorder(*t); fprintf(stderr, "n");*/
  1142. if ( *t == NULL )
  1143. {
  1144. /*** fprintf(stderr, "TreeIncomplete --> no LL(%d) ambiguityn", LL_k);*/
  1145. Tfree( *t ); /* kill if impossible to have ambig */
  1146. *t = NULL;
  1147. }
  1148. p = analysis_point((Junction *)alt2->p1);
  1149. TRAV(p, LL_k, &rk, *u);
  1150. *u = tshrink( *u );
  1151. *u = tflatten( *u );
  1152. *t = tleft_factor( *t );    /* MR10 */
  1153. *u = prune(*u, LL_k);
  1154. *u = tleft_factor( *u );
  1155. /* fprintf(stderr, "after shrink&flatten&prune&lfactor:"); preorder(*u); fprintf(stderr, "n");*/
  1156. if ( *u == NULL )
  1157. {
  1158. /* fprintf(stderr, "TreeIncomplete --> no LL(%d) ambiguityn", LL_k);*/
  1159. Tfree( *u );
  1160. *u = NULL;
  1161. }
  1162. for (k=1; k<=LL_k; k++) set_clr( fs[k] );
  1163. ambig = tnode(ALT);
  1164. k = 0;
  1165. if ( *t!=NULL && *u!=NULL )
  1166. {
  1167. while ( (perm=permute(1,LL_k))!=NULL )
  1168. {
  1169. /* fprintf(stderr, "chk perm:"); preorder(perm); fprintf(stderr, "n");*/
  1170. if ( tmember(perm, *t) && tmember(perm, *u) )
  1171. {
  1172. /* fprintf(stderr, "ambig upon"); preorder(perm); fprintf(stderr, "n");*/
  1173. k++;
  1174. perm->right = ambig->down;
  1175. ambig->down = perm;
  1176. tcvt(&(fs[1]), perm);
  1177. }
  1178. else Tfree( perm );
  1179. }
  1180. }
  1181.     for (j=0; j <= CLL_k ; j++) fs[j]=save_fs[j];
  1182.     free( (char *) save_fs);
  1183.     tnodes_at_end=TnodesAllocated;
  1184.     tnodes_used=tnodes_at_end - tnodes_at_start;
  1185.     if (TnodesReportThreshold > 0 && tnodes_used > TnodesReportThreshold) {
  1186.       fprintf(stdout,"There were %d tuples whose ambiguity could not be resolved by full lookaheadn",k);
  1187.       fprintf(stdout,"There were %d tnodes created to resolve ambiguity between:nn",tnodes_used);
  1188.       fprintf(stdout,"  Choice 1: %s  line %d  file %sn",
  1189.                                  MR_ruleNamePlusOffset( (Node *) alt1),alt1->line,FileStr[alt1->file]);
  1190.       fprintf(stdout,"  Choice 2: %s  line %d  file %sn",
  1191.                                  MR_ruleNamePlusOffset( (Node *) alt2),alt2->line,FileStr[alt2->file]);
  1192.       for (j=1; j <= CLL_k ; j++) {
  1193.         fprintf(stdout,"n    Intersection of lookahead[%d] sets:n",j);
  1194.         MR_dumpTokenSet(stdout,2,fs[j]);
  1195.       };
  1196.       fprintf(stdout,"n");
  1197.     };
  1198. *numAmbig = k;
  1199. if ( ambig->down == NULL ) {_Tfree(ambig); ambig = NULL;}
  1200. free( (char *)findex );
  1201. /* fprintf(stderr, "final ambig:"); preorder(ambig); fprintf(stderr, "n");*/
  1202. return ambig;
  1203. }
  1204. static Tree *
  1205. #ifdef __STDC__
  1206. bottom_of_chain( Tree *t )
  1207. #else
  1208. bottom_of_chain( t )
  1209. Tree *t;
  1210. #endif
  1211. {
  1212.     if ( t==NULL ) return NULL;
  1213.     for (; t->down != NULL; t=t->down) {;}
  1214.     return t;
  1215. }
  1216. /*
  1217.  * Make a tree from k sets where the degree of the first k-1 sets is 1.
  1218.  */
  1219. Tree *
  1220. #ifdef __STDC__
  1221. make_tree_from_sets( set *fset1, set *fset2 )
  1222. #else
  1223. make_tree_from_sets( fset1, fset2 )
  1224. set *fset1;
  1225. set *fset2;
  1226. #endif
  1227. {
  1228. set inter;
  1229. int i;
  1230. Tree *t=NULL, *n, *u;
  1231. unsigned *p,*q;
  1232. require(LL_k>1, "make_tree_from_sets: LL_k must be > 1");
  1233. /* do the degree 1 sets first */
  1234. for (i=1; i<=LL_k-1; i++)
  1235. {
  1236. inter = set_and(fset1[i], fset2[i]);
  1237. require(set_deg(inter)==1, "invalid set to tree conversion");
  1238. n = tnode(set_int(inter));
  1239. if (t==NULL) t=n; else tmake(t, n, NULL);
  1240. set_free(inter);
  1241. }
  1242. /* now add the chain of tokens at depth k */
  1243. u = bottom_of_chain(t);
  1244. inter = set_and(fset1[LL_k], fset2[LL_k]);
  1245. if ( (q=p=set_pdq(inter)) == NULL ) fatal_internal("Can't alloc space for set_pdq");
  1246. /* first one is linked to bottom, then others are sibling linked */
  1247. n = tnode(*p++);
  1248. u->down = n;
  1249. u = u->down;
  1250. while ( *p != nil )
  1251. {
  1252. n = tnode(*p);
  1253. u->right = n;
  1254. u = u->right;
  1255. p++;
  1256. }
  1257. free((char *)q);
  1258. return t;
  1259. }
  1260. /* create and return the tree of lookahead k-sequences that are in t, but not
  1261.  * in the context of predicates in predicate list p.
  1262.  */
  1263. Tree *
  1264. #ifdef __STDC__
  1265. tdif( Tree *ambig_tuples, Predicate *p, set *fset1, set *fset2 )
  1266. #else
  1267. tdif( ambig_tuples, p, fset1, fset2 )
  1268. Tree *ambig_tuples;
  1269. Predicate *p;
  1270. set *fset1;
  1271. set *fset2;
  1272. #endif
  1273. {
  1274. unsigned **ft;
  1275. Tree *dif=NULL;
  1276. Tree *perm;
  1277. set b;
  1278. int i,k;
  1279. if ( p == NULL ) return tdup(ambig_tuples);
  1280. ft = (unsigned **) calloc(CLL_k+1, sizeof(unsigned *));
  1281. require(ft!=NULL, "cannot allocate ft");
  1282. for (i=1; i<=CLL_k; i++)
  1283. {
  1284. b = set_and(fset1[i], fset2[i]);
  1285. ft[i] = set_pdq(b);
  1286. set_free(b);
  1287. }
  1288. findex = (int *) calloc(LL_k+1, sizeof(int));
  1289. if ( findex == NULL )
  1290. {
  1291. fatal_internal("out of memory in tdif while checking predicates");
  1292. }
  1293. for (k=1; k<=LL_k; k++) findex[k] = 0;
  1294. #ifdef DBG_TRAV
  1295. fprintf(stderr, "tdif_%d[", p->k);
  1296. preorder(ambig_tuples);
  1297. fprintf(stderr, ",");
  1298. preorder(p->tcontext);
  1299. fprintf(stderr, "] =");
  1300. #endif
  1301. ftbl = ft;
  1302. while ( (perm=permute(1,p->k))!=NULL )
  1303. {
  1304. #ifdef DBG_TRAV
  1305. fprintf(stderr, "test perm:"); preorder(perm); fprintf(stderr, "n");
  1306. #endif
  1307. if ( tmember_constrained(perm, ambig_tuples) &&
  1308.  !tmember_of_context(perm, p) )
  1309. {
  1310. #ifdef DBG_TRAV
  1311. fprintf(stderr, "satisfied upon"); preorder(perm); fprintf(stderr, "n");
  1312. #endif
  1313. k++;
  1314. if ( dif==NULL ) dif = perm;
  1315. else
  1316. {
  1317. perm->right = dif;
  1318. dif = perm;
  1319. }
  1320. }
  1321. else Tfree( perm );
  1322. }
  1323. #ifdef DBG_TRAV
  1324. preorder(dif);
  1325. fprintf(stderr, "n");
  1326. #endif
  1327. for (i=1; i<=CLL_k; i++) free( (char *)ft[i] );
  1328. free((char *)ft);
  1329. free((char *)findex);
  1330. return dif;
  1331. }
  1332. /* is lookahead sequence t a member of any context tree for any
  1333.  * predicate in p?
  1334.  */
  1335. static int
  1336. #ifdef __STDC__
  1337. tmember_of_context( Tree *t, Predicate *p )
  1338. #else
  1339. tmember_of_context( t, p )
  1340. Tree *t;
  1341. Predicate *p;
  1342. #endif
  1343. {
  1344. for (; p!=NULL; p=p->right)
  1345. {
  1346. if ( p->expr==PRED_AND_LIST || p->expr==PRED_OR_LIST )
  1347. return tmember_of_context(t, p->down);
  1348. if ( tmember_constrained(t, p->tcontext) ) return 1;
  1349. if ( tmember_of_context(t, p->down) ) return 1;
  1350. }
  1351. return 0;
  1352. }
  1353. int
  1354. #ifdef __STDC__
  1355. is_single_tuple( Tree *t )
  1356. #else
  1357. is_single_tuple( t )
  1358. Tree *t;
  1359. #endif
  1360. {
  1361. if ( t == NULL ) return 0;
  1362. if ( t->right != NULL ) return 0;
  1363. if ( t->down == NULL ) return 1;
  1364. return is_single_tuple(t->down);
  1365. }
  1366. /* MR10 Check that a context guard contains only allowed things */
  1367. /* MR10   (mainly token references).                            */
  1368. #ifdef __STDC__
  1369. int contextGuardOK(Node *p,int h,int *hmax)
  1370. #else
  1371. int contextGuardOK(p,h,hmax)
  1372.   Node  *p;
  1373.   int   h;
  1374.   int   *hmax;
  1375. #endif
  1376. {
  1377.     Junction     *j;
  1378.     TokNode      *tn;
  1379.     if (p == NULL) return 1;
  1380.     if (p->ntype == nToken) {
  1381.       h++;
  1382.       if (h > *hmax) *hmax=h;
  1383.       tn=(TokNode *)p;
  1384.       if (tn->el_label != NULL) {
  1385.         warnFL(eMsg1("a label ("%s") for a context guard element is meaningless",tn->el_label),
  1386.                              FileStr[p->file],p->line);
  1387.       };
  1388.       return contextGuardOK( ( (TokNode *) p)->next,h,hmax);
  1389.     } else if (p->ntype == nAction) {
  1390.       goto Fail;
  1391.     } else if (p->ntype == nRuleRef) {
  1392.       goto Fail;
  1393.     } else {
  1394.       require (p->ntype == nJunction,"Unexpected ntype");
  1395.       j=(Junction *) p;
  1396.       if (j->jtype != Generic &&
  1397.           j->jtype != aSubBlk &&        /* pretty sure this one is allowed */
  1398. /****     j->jtype != aOptBlk && ****/  /* pretty sure this one is allowed */ /* MR11 not any more ! */
  1399.           j->jtype != EndBlk) {
  1400.         errFL("A context guard may not contain an option block: {...} or looping block: (...)* or (...)+",
  1401.                   FileStr[p->file],p->line);
  1402.         contextGuardOK(j->p1,h,hmax);
  1403.         return 0;
  1404.       };
  1405.       /* do both p1 and p2 so use | rather than ||  */
  1406.       return contextGuardOK(j->p2,h,hmax) | contextGuardOK(j->p1,h,hmax);
  1407.     };
  1408. Fail:
  1409.     errFL("A context guard may contain only Token references - guard will be ignored",
  1410.                              FileStr[p->file],p->line);
  1411.     contextGuardOK( ( (ActionNode *) p)->next,h,hmax);
  1412.     return 0;
  1413. }
  1414. /*
  1415.  * Look at a (...)? generalized-predicate context-guard and compute
  1416.  * either a lookahead set (k==1) or a lookahead tree for k>1.  The
  1417.  * k level is determined by the guard itself rather than the LL_k
  1418.  * variable.  For example, ( A B )? is an LL(2) guard and ( ID )?
  1419.  * is an LL(1) guard.  For the moment, you can only have a single
  1420.  * tuple in the guard.  Physically, the block must look like this
  1421.  *   --o-->TOKEN-->o-->o-->TOKEN-->o-- ... -->o-->TOKEN-->o--
  1422.  * An error is printed for any other type.
  1423.  */
  1424. Predicate *
  1425. #ifdef __STDC__
  1426. computePredicateFromContextGuard(Graph blk,int *msgDone)    /* MR10 */
  1427. #else
  1428. computePredicateFromContextGuard(blk,msgDone)               /* MR10 */
  1429.   Graph     blk;
  1430.   int       *msgDone;                                       /* MR10 */
  1431. #endif
  1432. {
  1433.     Junction *junc = (Junction *)blk.left, *p;
  1434.     Tree        *t=NULL;
  1435. Predicate   *pred = NULL;
  1436. set         scontext, rk;
  1437.     int         ok;
  1438.     int         hmax=0;
  1439.     require(junc!=NULL && junc->ntype == nJunction, "bad context guard");
  1440. /* MR10 Check for anything other than Tokens and generic junctions */
  1441.     *msgDone=0;                                             /* MR10 */
  1442.     ok=contextGuardOK( (Node *)junc,0,&hmax);               /* MR10 */
  1443.     if (! ok) {                                             /* MR10 */
  1444.       *msgDone=1;                                           /* MR10 */
  1445.       return NULL;                                          /* MR10 */
  1446.     };                                                      /* MR10 */
  1447.     if (hmax == 0) {
  1448. errFL("guard is 0 tokens long",FileStr[junc->file],junc->line);          /* MR11 */
  1449.       *msgDone=1;
  1450.       return NULL;
  1451.     };
  1452.     if (hmax > CLL_k) {                                     /* MR10 */
  1453. errFL(eMsgd2("guard is %d tokens long - lookahead is limited to max(k,ck)==%d", /* MR10 */
  1454.         hmax,CLL_k),                                        /* MR10 */
  1455.         FileStr[junc->file],junc->line);                    /* MR10 */
  1456.       *msgDone=1;                                           /* MR10 */
  1457.       return NULL;                                          /* MR10 */
  1458.     };                                                      /* MR10 */
  1459. rk = empty;
  1460. p = junc;
  1461. pred = new_pred();
  1462. pred->k = hmax;     /* MR10 should be CLL_k, not LLK ? */
  1463. if (hmax > 1 )      /* MR10 was LL_k                   */
  1464. {
  1465. ConstrainSearch = 0;
  1466. ContextGuardTRAV = 1;
  1467. TRAV(p, hmax, &rk, t);  /* MR10 was LL_k */
  1468. ContextGuardTRAV = 0;
  1469. set_free(rk);
  1470. t = tshrink( t );
  1471. t = tflatten( t );
  1472. t = tleft_factor( t );
  1473. /*
  1474. fprintf(stderr, "ctx guard:");
  1475. preorder(t);
  1476. fprintf(stderr, "n");
  1477. */
  1478. pred->tcontext = t;
  1479. }
  1480. else
  1481. {
  1482. REACH(p, 1, &rk, scontext);
  1483. require(set_nil(rk), "rk != nil");
  1484. set_free(rk);
  1485. /*
  1486. fprintf(stderr, "LL(1) ctx guard is:");
  1487. s_fprT(stderr, scontext);
  1488. fprintf(stderr, "n");
  1489. */
  1490. pred->scontext[1] = scontext;
  1491. }
  1492.     list_add(&ContextGuardPredicateList,pred);     /* MR13 */
  1493. return pred;
  1494. }
  1495. /* MR13
  1496.    When the context guard is originally computed the
  1497.    meta-tokens are not known.
  1498. */
  1499. #ifdef __STDC__
  1500. void recomputeContextGuard(Predicate *pred)
  1501. #else
  1502. void recomputeContextGuard(pred)
  1503.     Predicate   *pred;
  1504. #endif
  1505. {
  1506.     Tree *          t=NULL;
  1507. set             scontext;
  1508.     set             rk;
  1509.     ActionNode *    actionNode;
  1510.     Junction *      p;
  1511.     actionNode=pred->source;
  1512.     require (actionNode != NULL,"context predicate's source == NULL");
  1513.     p=actionNode->guardNodes;
  1514.     require (p != NULL,"context predicate's guardNodes == NULL");
  1515. rk = empty;
  1516. if (pred->k > 1 )
  1517. {
  1518. ConstrainSearch = 0;
  1519. ContextGuardTRAV = 1;
  1520. TRAV(p, pred->k, &rk, t);
  1521. ContextGuardTRAV = 0;
  1522. set_free(rk);
  1523. t = tshrink( t );
  1524. t = tflatten( t );
  1525. t = tleft_factor( t );
  1526.         Tfree(pred->tcontext);
  1527. pred->tcontext = t;
  1528. }
  1529. else
  1530. {
  1531. REACH(p, 1, &rk, scontext);
  1532. require(set_nil(rk), "rk != nil");
  1533. set_free(rk);
  1534.         set_free(pred->scontext[1]);
  1535. pred->scontext[1] = scontext;
  1536. }
  1537. }
  1538. /* MR11 - had enough of flags yet ? */
  1539. int     MR_AmbSourceSearch=0;
  1540. int     MR_AmbSourceSearchGroup=0;
  1541. int     MR_AmbSourceSearchChoice=0;
  1542. int     MR_AmbSourceSearchLimit=0;
  1543. int     MR_matched_AmbAidRule=0;
  1544. static    set         *matchSets[2]={NULL,NULL};
  1545. static    int         *tokensInChain=NULL;
  1546. static    Junction    *MR_AmbSourceSearchJ[2];
  1547. void MR_traceAmbSourceKclient()
  1548. {
  1549.   int       i;
  1550.   set       *save_fset;
  1551.   int       save_ConstrainSearch;
  1552.   set       incomplete;
  1553.   Tree      *t;
  1554.   if (matchSets[0] == NULL) {
  1555.     matchSets[0]=(set *) calloc (CLL_k+1,sizeof(set));
  1556.     require (matchSets[0] != NULL,"matchSets[0] alloc");
  1557.     matchSets[1]=(set *) calloc (CLL_k+1,sizeof(set));
  1558.     require (matchSets[1] != NULL,"matchSets[1] alloc");
  1559.   };
  1560.   for (i=1 ; i <= MR_AmbSourceSearchLimit ; i++) {
  1561.     set_clr(matchSets[0][i]);
  1562.     set_orel( (unsigned) tokensInChain[i],
  1563.                               &matchSets[0][i]);
  1564.     set_clr(matchSets[1][i]);
  1565.     set_orel( (unsigned) tokensInChain[i],
  1566.                               &matchSets[1][i]);
  1567.   };
  1568.   save_fset=fset;
  1569.   save_ConstrainSearch=ConstrainSearch;
  1570.   for (i=0 ; i < 2 ; i++) {
  1571. #if 0
  1572. **    fprintf(stdout,"  Choice:%d  Depth:%d  ",i+1,MR_AmbSourceSearchLimit);
  1573. **    fprintf(stdout,"(");
  1574. **    for (j=1 ; j <= MR_AmbSourceSearchLimit ; j++) {
  1575. **      if (j != 1) fprintf(stdout," ");
  1576. **      fprintf(stdout,"%s",TerminalString(tokensInChain[j]));
  1577. **    };
  1578. **    fprintf(stdout,")nn");
  1579. #endif
  1580.     fset=matchSets[i];
  1581.     MR_AmbSourceSearch=1;
  1582.     MR_MaintainBackTrace=1;
  1583.     MR_AmbSourceSearchChoice=i;
  1584.     ConstrainSearch=1;
  1585.     maxk = MR_AmbSourceSearchLimit;
  1586.     incomplete=empty;
  1587.     t=NULL;
  1588.     constrain = &(fset[1]);
  1589.     MR_pointerStackReset(&MR_BackTraceStack);
  1590.     TRAV(MR_AmbSourceSearchJ[i],maxk,&incomplete,t);
  1591.     Tfree(t);
  1592.     require (set_nil(incomplete),"MR_traceAmbSourceK TRAV incomplete");
  1593.     require (MR_BackTraceStack.count == 0,"K: MR_BackTraceStack.count != 0");
  1594.     set_free(incomplete);
  1595.   };
  1596.   ConstrainSearch=save_ConstrainSearch;
  1597.   fset=save_fset;
  1598.   MR_AmbSourceSearch=0;
  1599.   MR_MaintainBackTrace=0;
  1600.   MR_AmbSourceSearchChoice=0;
  1601. }
  1602. #ifdef __STDC__
  1603. Tree *tTrunc(Tree *t,int depth)
  1604. #else
  1605. Tree *tTrunc(t,depth)
  1606.   Tree  *t;
  1607. #endif
  1608. {
  1609.     Tree    *u;
  1610.     require ( ! (t == NULL && depth > 0),"tree too short");
  1611.     if (depth == 0) return NULL;
  1612.     if (t->token == ALT) {
  1613.       u=tTrunc(t->down,depth);
  1614.     } else {
  1615.       u=tnode(t->token);
  1616.       u->down=tTrunc(t->down,depth-1);
  1617.     };
  1618.     if (t->right != NULL) u->right=tTrunc(t->right,depth);
  1619.     return u;
  1620. }
  1621. #ifdef __STDC__
  1622. void MR_iterateOverTree(Tree *t,int chain[])
  1623. #else
  1624. void MR_iterateOverTree(t,chain)
  1625.   Tree          *t;
  1626.   int           chain[];
  1627. #endif
  1628. {
  1629.   if (t == NULL) return;
  1630.   chain[0]=t->token;
  1631.   if (t->down != NULL) {
  1632.     MR_iterateOverTree(t->down,&chain[1]);
  1633.   } else {
  1634.     MR_traceAmbSourceKclient();
  1635.   };
  1636.   MR_iterateOverTree(t->right,&chain[0]);
  1637.   chain[0]=0;
  1638. }
  1639. #ifdef __STDC__
  1640. void MR_traceAmbSourceK(Tree *t,Junction *alt1,Junction *alt2)
  1641. #else
  1642. void MR_traceAmbSourceK(t,alt1,alt2)
  1643.   Tree      *t;
  1644.   Junction  *alt1;
  1645.   Junction  *alt2;
  1646. #endif
  1647. {
  1648.     int         i;
  1649.     int         depth;
  1650.     int         maxDepth;
  1651.     Tree        *truncatedTree;
  1652.     if (MR_AmbAidRule == NULL) return;
  1653.     if ( ! (
  1654.             strcmp(MR_AmbAidRule,alt1->rname) == 0 ||
  1655.             strcmp(MR_AmbAidRule,alt2->rname) == 0 ||
  1656.             MR_AmbAidLine==alt1->line ||
  1657.             MR_AmbAidLine==alt2->line
  1658.            )
  1659.        ) return;
  1660.     MR_matched_AmbAidRule++;
  1661.     /* there are no token sets in trees, only in TokNodes */
  1662.     MR_AmbSourceSearchJ[0]=analysis_point( (Junction *) alt1->p1);
  1663.     MR_AmbSourceSearchJ[1]=analysis_point( (Junction *) alt2->p1);
  1664.     if (tokensInChain == NULL) {
  1665.       tokensInChain=(int *) calloc (CLL_k+1,sizeof(int));
  1666.       require (tokensInChain != NULL,"tokensInChain alloc");
  1667.     };
  1668.     MR_AmbSourceSearchGroup=0;
  1669.     fprintf(stdout,"n");
  1670.     fprintf(stdout,"  Ambiguity Aid                 ");
  1671.     fprintf(stdout,
  1672.                 (MR_AmbAidDepth <= LL_k ?
  1673.                     "(-k %d  -aa %s  %s  -aad %d)nn" :
  1674.                         "(-k %d  -aa %s  %s  [-k value limits -aad %d])nn"),
  1675.                 LL_k,
  1676.                 MR_AmbAidRule,
  1677.                 (MR_AmbAidMultiple ? "-aam" : ""),
  1678.                 MR_AmbAidDepth);
  1679.     for (i=0 ; i < 2 ; i++) {
  1680.       fprintf(stdout,"    Choice %d: %-25s  line %d  file %sn",
  1681.                   (i+1),
  1682.                   MR_ruleNamePlusOffset( (Node *) MR_AmbSourceSearchJ[i]),
  1683.                   MR_AmbSourceSearchJ[i]->line,
  1684.                   FileStr[MR_AmbSourceSearchJ[i]->file]);
  1685.     };
  1686.     fprintf(stdout,"n");
  1687.     if (MR_AmbAidDepth < LL_k) {
  1688.       maxDepth=MR_AmbAidDepth;
  1689.     } else {
  1690.       maxDepth=LL_k;
  1691.     };
  1692.     for (depth=1 ; depth <= maxDepth; depth++) {
  1693.       MR_AmbSourceSearchLimit=depth;
  1694.       if (depth < LL_k) {
  1695.         truncatedTree=tTrunc(t,depth);
  1696.         truncatedTree=tleft_factor(truncatedTree);
  1697.         MR_iterateOverTree(truncatedTree,&tokensInChain[1]);    /* <===== */
  1698.         Tfree(truncatedTree);
  1699.       } else {
  1700.         MR_iterateOverTree(t,tokensInChain);                /* <===== */
  1701.       };
  1702.       fflush(stdout);
  1703.       fflush(stderr);
  1704.     };
  1705.     fprintf(stdout,"n");
  1706.     MR_AmbSourceSearch=0;
  1707.     MR_MaintainBackTrace=0;
  1708.     MR_AmbSourceSearchGroup=0;
  1709.     MR_AmbSourceSearchChoice=0;
  1710.     MR_AmbSourceSearchLimit=0;
  1711. }
  1712. /* this if for k=1 grammars only
  1713.    this is approximate only because of the limitations of linear
  1714.    approximation lookahead.  Don't want to do a k=3 search when
  1715.    the user only specified a ck=3 grammar
  1716. */
  1717. #ifdef __STDC__
  1718. void MR_traceAmbSource(set *matchSets,Junction *alt1, Junction *alt2)
  1719. #else
  1720. void MR_traceAmbSource(matchSets,alt1,alt2)
  1721.   set       *matchSets;
  1722.   Junction  *alt1;
  1723.   Junction  *alt2;
  1724. #endif
  1725. {
  1726.     set         *save_fset;
  1727.     Junction    *p[2];
  1728.     int         i;
  1729.     int         j;
  1730.     set         *dup_matchSets;
  1731.     set         intersection;
  1732.     set         incomplete;
  1733.     set         tokensUsed;
  1734.     int         depth;
  1735.     if (MR_AmbAidRule == NULL) return;
  1736.     if ( ! (
  1737.             strcmp(MR_AmbAidRule,alt1->rname) == 0 ||
  1738.             strcmp(MR_AmbAidRule,alt2->rname) == 0 ||
  1739.             MR_AmbAidLine==alt1->line ||
  1740.             MR_AmbAidLine==alt2->line
  1741.            )
  1742.        ) return;
  1743.     MR_matched_AmbAidRule++;
  1744.     save_fset=fset;
  1745.     dup_matchSets=(set *) calloc(CLL_k+1,sizeof(set));
  1746.     require (dup_matchSets != NULL,"Can't allocate dup_matchSets");
  1747.     p[0]=analysis_point( (Junction *) alt1->p1);
  1748.     p[1]=analysis_point( (Junction *) alt2->p1);
  1749.     fprintf(stdout,"n");
  1750.     fprintf(stdout,"  Ambiguity Aid                 ");
  1751.     fprintf(stdout,
  1752.                 (MR_AmbAidDepth <= CLL_k ?
  1753.                     "(-ck %d  -aa %s  %s  -aad %d)nn" :
  1754.                         "(-ck %d  -aa %s  %s  [-ck value limits -aad %d])nn"),
  1755.                 CLL_k,
  1756.                 MR_AmbAidRule,
  1757.                 (MR_AmbAidMultiple ? "-aam" : ""),
  1758.                 MR_AmbAidDepth);
  1759.     for (i=0 ; i < 2 ; i++) {
  1760.       fprintf(stdout,"    Choice %d: %-25s  line %d  file %sn",
  1761.                             (i+1),
  1762.                             MR_ruleNamePlusOffset( (Node *) p[i]),
  1763.                             p[i]->line,FileStr[p[i]->file]);
  1764.     };
  1765.     for (j=1; j <= CLL_k ; j++) {
  1766.       fprintf(stdout,"n    Intersection of lookahead[%d] sets:n",j);
  1767.       intersection=set_and(alt1->fset[j],alt2->fset[j]);
  1768.       MR_dumpTokenSet(stdout,2,intersection);
  1769.       set_free(intersection);
  1770.     };
  1771.     fprintf(stdout,"n");
  1772.     require (1 <= MR_AmbAidDepth && MR_AmbAidDepth <= CLL_k,
  1773.                 "illegal MR_AmbAidDepth");
  1774.     MR_AmbSourceSearchGroup=0;
  1775.     for (depth=1; depth <= MR_AmbAidDepth; depth++) {
  1776.         MR_AmbSourceSearchLimit=depth;
  1777.         for (i=0 ; i < 2 ; i++) {
  1778. /***        fprintf(stdout,"  Choice:%d  Depth:%dnn",i+1,depth);  ***/
  1779.             for (j=0 ; j <= CLL_k ; j++) { dup_matchSets[j]=set_dup(matchSets[j]); };
  1780.             fset=dup_matchSets;
  1781.             fflush(output);
  1782.             fflush(stdout);
  1783.             MR_AmbSourceSearch=1;
  1784.             MR_MaintainBackTrace=1;
  1785.             MR_AmbSourceSearchChoice=i;
  1786.             maxk = depth;
  1787.             tokensUsed=empty;
  1788.             incomplete=empty;
  1789.             constrain = &(fset[1]);
  1790.             MR_pointerStackReset(&MR_BackTraceStack);
  1791.             REACH(p[i],depth,&incomplete,tokensUsed);
  1792.             fflush(output);
  1793.             fflush(stdout);
  1794.             require (set_nil(incomplete),"MR_traceAmbSource REACH incomplete");
  1795.             require (MR_BackTraceStack.count == 0,"1: MR_BackTraceStack.count != 0");
  1796.             set_free(incomplete);
  1797.             set_free(tokensUsed);
  1798.             for (j=0 ; j <= CLL_k ; j++) { set_free(dup_matchSets[j]); };
  1799.         };
  1800.     };
  1801.     fprintf(stdout,"n");
  1802.     MR_AmbSourceSearch=0;
  1803.     MR_MaintainBackTrace=0;
  1804.     MR_AmbSourceSearchGroup=0;
  1805.     MR_AmbSourceSearchChoice=0;
  1806.     MR_AmbSourceSearchLimit=0;
  1807.     fset=save_fset;
  1808.     free ( (char *) dup_matchSets);
  1809. }
  1810. static int itemCount;
  1811. void MR_backTraceDumpItemReset() {
  1812.   itemCount=0;
  1813. }
  1814. #ifdef __STDC__
  1815. void MR_backTraceDumpItem(FILE *f,int skip,Node *n)
  1816. #else
  1817. void MR_backTraceDumpItem(f,skip,n)
  1818.   FILE      *f;
  1819.   int       skip;
  1820.   Node      *n;
  1821. #endif
  1822. {
  1823.   TokNode       *tn;
  1824.   RuleRefNode   *rrn;
  1825.   Junction      *j;
  1826.   ActionNode    *a;
  1827.   switch (n->ntype) {
  1828.     case nToken:
  1829.         itemCount++; if (skip) goto EXIT;
  1830.         tn=(TokNode *)n;
  1831.         if (set_nil(tn->tset)) {
  1832.           fprintf(f,"  %2d #token %-23s",itemCount,TerminalString(tn->token));
  1833.         } else {
  1834.           fprintf(f,"  %2d #tokclass %-20s",itemCount,TerminalString(tn->token));
  1835.         };
  1836.         break;
  1837.     case nRuleRef:
  1838.         itemCount++; if (skip) goto EXIT;
  1839.         rrn=(RuleRefNode *)n;
  1840.         fprintf(f,"  %2d to %-27s",itemCount,rrn->text);
  1841.         break;
  1842.     case nAction:
  1843.         a=(ActionNode *)n;
  1844.         goto EXIT;
  1845.     case nJunction:
  1846.       j=(Junction *)n;
  1847.       switch (j->jtype) {
  1848.         case aSubBlk:
  1849.             if (j->guess) {
  1850.               itemCount++; if (skip) goto EXIT;
  1851.               fprintf(f,"  %2d %-30s",itemCount,"in (...)? block at");
  1852.               break;
  1853.             };
  1854. /******     fprintf(f,"  %2d %-32s",itemCount,"in (...) block at");  *******/
  1855. /******     break;                                                          *******/
  1856.             goto EXIT;
  1857.         case aOptBlk:
  1858.             itemCount++; if (skip) goto EXIT;
  1859.             fprintf(f,"  %2d %-30s",itemCount,"in {...} block");
  1860.             break;
  1861.         case aLoopBlk:
  1862.             itemCount++; if (skip) goto EXIT;
  1863.             fprintf(f,"  %2d %-30s",itemCount,"in (...)* block");
  1864.             break;
  1865.         case EndBlk:
  1866.             if (j->alpha_beta_guess_end) {
  1867.               itemCount++; if (skip) goto EXIT;
  1868.               fprintf(f,"  %2d %-30s",itemCount,"end (...)? block at");
  1869.               break;
  1870.             };
  1871.             goto EXIT;
  1872. /******     fprintf(f,"  %2d %-32s",itemCount,"end of a block at");     *****/
  1873. /******     break;                                                             *****/
  1874.         case RuleBlk:
  1875.             itemCount++; if (skip) goto EXIT;
  1876.             fprintf(f,"  %2d %-30s",itemCount,j->rname);
  1877.             break;
  1878.         case Generic:
  1879.             goto EXIT;
  1880.         case EndRule:
  1881.             itemCount++; if (skip) goto EXIT;
  1882.             fprintf (f,"  %2d end %-26s",itemCount,j->rname);
  1883.             break;
  1884.         case aPlusBlk:
  1885.             itemCount++; if (skip) goto EXIT;
  1886.             fprintf(f,"  %2d %-30s",itemCount,"in (...)+ block");
  1887.             break;
  1888.         case aLoopBegin:
  1889.             goto EXIT;
  1890.       };
  1891.       break;
  1892.   };
  1893.   fprintf(f," %-23s line %-4d  %sn",MR_ruleNamePlusOffset(n),n->line,FileStr[n->file]);
  1894. EXIT:
  1895.   return;
  1896. }
  1897. static PointerStack     previousBackTrace={0,0,NULL};
  1898. #ifdef __STDC__
  1899. void MR_backTraceReport()
  1900. #else
  1901. void MR_backTraceReport()
  1902. #endif
  1903. {
  1904.   int       i;
  1905.   int       match;
  1906.   int       limitMatch;
  1907.   Node      *p;
  1908.   TokNode   *tn;
  1909.   set       remainder;
  1910.   int       depth;
  1911.   /* Even when doing a k=2 search this routine can get
  1912.        called when there is only 1 token on the stack.
  1913.      This is because something like rRuleRef can change
  1914.        the search value of k from 2 to 1 temporarily.
  1915.      It does this because the it wants to know the k=1
  1916.        first set before it does a k=2 search
  1917.   */
  1918.   depth=0;
  1919.   for (i=0; i < MR_BackTraceStack.count ; i++) {
  1920.     p=(Node *) MR_BackTraceStack.data[i];
  1921.     if (p->ntype == nToken) depth++;
  1922.   };
  1923. /* MR14 */  if (MR_AmbSourceSearch) {
  1924. /* MR14 */     require (depth <= MR_AmbSourceSearchLimit,"depth > MR_AmbSourceSearchLimit");
  1925. /* MR14 */  }
  1926.   if (depth < MR_AmbSourceSearchLimit) {
  1927.     return;
  1928.   };
  1929.   MR_backTraceDumpItemReset();
  1930.   limitMatch=MR_BackTraceStack.count;
  1931.   if (limitMatch > previousBackTrace.count) {
  1932.     limitMatch=previousBackTrace.count;
  1933.   };
  1934.   for (match=0; match < limitMatch; match++) {
  1935.     if (MR_BackTraceStack.data[match] !=
  1936.         previousBackTrace.data[match]) {
  1937.       break;
  1938.     };
  1939.   };
  1940.   /* not sure at the moment why there would be duplicates */
  1941.   if (match != MR_BackTraceStack.count) {
  1942.     fprintf(stdout,"     Choice:%d  Depth:%d  Group:%d",
  1943.         (MR_AmbSourceSearchChoice+1),
  1944.         MR_AmbSourceSearchLimit,
  1945.         ++MR_AmbSourceSearchGroup);
  1946.     depth=0;
  1947.     fprintf(stdout,"  (");
  1948.     for (i=0; i < MR_BackTraceStack.count ; i++) {
  1949.       p=(Node *) MR_BackTraceStack.data[i];
  1950.       if (p->ntype != nToken) continue;
  1951.       tn=(TokNode *)p;
  1952.       if (depth != 0) fprintf(stdout," ");
  1953.       fprintf(stdout,TerminalString(tn->token));
  1954.       depth++;
  1955.       if (! MR_AmbAidMultiple) {
  1956.         if (set_nil(tn->tset)) {
  1957.           set_rm( (unsigned) tn->token,fset[depth]);
  1958.         } else {
  1959.           remainder=set_dif(fset[depth],tn->tset);
  1960.           set_free(fset[depth]);
  1961.           fset[depth]=remainder;
  1962.         };
  1963.       };
  1964.     };
  1965.     fprintf(stdout,")n");
  1966.     for (i=0; i < MR_BackTraceStack.count ; i++) {
  1967.       MR_backTraceDumpItem(stdout, (i<match) ,(Node *) MR_BackTraceStack.data[i]);
  1968.     };
  1969.     fprintf(stdout,"n");
  1970.     fflush(stdout);
  1971.     MR_pointerStackReset(&previousBackTrace);
  1972.     for (i=0; i < MR_BackTraceStack.count ; i++) {
  1973.       MR_pointerStackPush(&previousBackTrace,MR_BackTraceStack.data[i]);
  1974.     };
  1975.   };
  1976. }