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

编译器/解释器

开发平台:

Others

  1. /*
  2.  * fcache.c
  3.  *
  4.  * SOFTWARE RIGHTS
  5.  *
  6.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  7.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  8.  * company may do whatever they wish with source code distributed with
  9.  * PCCTS or the code generated by PCCTS, including the incorporation of
  10.  * PCCTS, or its output, into commerical software.
  11.  *
  12.  * We encourage users to develop software with PCCTS.  However, we do ask
  13.  * that credit is given to us for developing PCCTS.  By "credit",
  14.  * we mean that if you incorporate our source code into one of your
  15.  * programs (commercial product, research project, or otherwise) that you
  16.  * acknowledge this fact somewhere in the documentation, research report,
  17.  * etc...  If you like PCCTS and have developed a nice tool with the
  18.  * output, please mention that you developed it using PCCTS.  In
  19.  * addition, we ask that this header remain intact in our source code.
  20.  * As long as these guidelines are kept, we expect to continue enhancing
  21.  * this system and expect to make other tools available as they are
  22.  * completed.
  23.  *
  24.  * ANTLR 1.33MR10
  25.  *
  26.  */
  27. #include <stdio.h>
  28. #ifdef __cplusplus
  29. #ifndef __STDC__
  30. #define __STDC__
  31. #endif
  32. #endif
  33. #include <ctype.h>
  34. #include "set.h"
  35. #include "syn.h"
  36. #include "hash.h"
  37. #include "generic.h"
  38. #ifdef __STDC__
  39. CacheEntry *dumpFcache1(char *prev)
  40. #else
  41. CacheEntry *dumpFcache1(prev)
  42.   char  *prev;
  43. #endif
  44. {
  45.     Entry   **table=Fcache;
  46.     int     low=0;
  47.     int     hi=0;
  48.     CacheEntry  *least=NULL;
  49. Entry   **p;
  50. for (p=table; p<&(table[HashTableSize]); p++) {
  51. CacheEntry *q =(CacheEntry *) *p;
  52. if ( q != NULL && low==0 ) low = p-table;
  53. while ( q != NULL ) {
  54.             if (strcmp(q->str,prev) > 0) {
  55.               if (least == NULL) {
  56.                 least=q;
  57.               } else {
  58.                 if (strcmp(q->str,least->str) < 0) {
  59.                   least=q;
  60.                 };
  61.               };
  62.             };
  63. q = q->next;
  64. };
  65. if ( *p != NULL ) hi = p-table;
  66. }
  67.     return least;
  68. }
  69. #ifdef __STDC__
  70. void reportFcache(CacheEntry *q)
  71. #else
  72. void reportFcache(q)
  73.   CacheEntry    *q;
  74. #endif
  75. {
  76.     char        *qstr;
  77.     fprintf(stdout,"nrule ");
  78.     for (qstr=q->str; *qstr != '*' ; qstr++) {
  79.       fprintf(stdout,"%c",*qstr);
  80.     };
  81.     qstr++;
  82.     if (*qstr == 'i') fprintf(stdout," First[");
  83.     if (*qstr == 'o') fprintf(stdout," Follow[");
  84.     qstr++;
  85.     fprintf(stdout,"%s]",qstr);
  86.     if (q->incomplete) fprintf(stdout," *** incomplete ***");
  87.     fprintf(stdout,"n");
  88.     MR_dumpTokenSet(stdout,1,q->fset);
  89. }
  90. void DumpFcache() {
  91.     char        *prev="";
  92.     int          n=0;
  93.     CacheEntry  *next;
  94.     fprintf(stdout,"nnDump of First/Follow Cachen");
  95.     while (1) {
  96.       next=dumpFcache1(prev);
  97.       if (next == NULL) break;
  98.       reportFcache(next);
  99.       ++n;
  100.       prev=next->str;
  101.     };
  102.     fprintf(stdout,"nEnd dump of First/Follow Cachen");
  103. }