Home | History | Annotate | Download | only in antlr
      1 #include <stdio.h>
      2 #include <ctype.h>
      3 
      4 #include "set.h"
      5 #include "syn.h"
      6 #include "hash.h"
      7 #include "generic.h"
      8 
      9 #ifdef __USE_PROTOS
     10 void dumpset1(set s)
     11 #else
     12 void dumpset1(s)
     13   set   s;
     14 #endif
     15 {
     16   if (set_nil(s)) {
     17     fprintf(stderr,"{}");
     18   } else {
     19     s_fprT(stderr,s);
     20   };
     21 }
     22 
     23 #ifdef __USE_PROTOS
     24 void dumpset(set s)
     25 #else
     26 void dumpset(s)
     27   set   s;
     28 #endif
     29 {
     30   dumpset1(s);
     31   fprintf(stderr,"\n");
     32 }
     33 
     34 #ifdef __USE_PROTOS
     35 int isEndRule(Node * p)
     36 #else
     37 int isEndRule(p)
     38   Node *    p;
     39 #endif
     40 {
     41   int       result=0;
     42   if ( p->ntype == nJunction &&
     43        ( (Junction *) p)->jtype == EndRule) {
     44     result=1;
     45   };
     46   return result;
     47 }
     48 
     49 #ifdef __USE_PROTOS
     50 void dumppred1(int depth,Predicate *p)
     51 #else
     52 void dumppred1(depth,p)
     53   int           depth;
     54   Predicate     *p;
     55 #endif
     56 {
     57   int       i;
     58   int       k;
     59 
     60   for (i=0; i<depth ; i++) {
     61     fprintf(stderr,"  ");
     62   };
     63   if (p->expr == PRED_AND_LIST ||
     64       p->expr == PRED_OR_LIST) {
     65     fprintf(stderr," %s", (p->expr == NULL ? "null expr" : p->expr));
     66     if (p->inverted) fprintf(stderr," predicate inverted !");
     67     if (p->redundant) {
     68       fprintf(stderr," Redundant!");
     69     };
     70     if (p->isConst) fprintf(stderr," const %d !",p->constValue);
     71     fprintf(stderr,"\n");
     72   } else {
     73     fprintf(stderr,"predicate k=%d",p->k);
     74     k=set_int(p->completionSet);
     75     if (k >= 0) {
     76       fprintf(stderr," Incomplete Set=%d !",k);
     77     };
     78     k=set_int(p->completionTree);
     79     if (k >= 0) {
     80       fprintf(stderr," Incomplete Tree=%d !",k);
     81     };
     82     if (p->redundant) {
     83       fprintf(stderr," Redundant!");
     84     };
     85     fprintf(stderr," \"%s\" (%x)", (p->expr == NULL ? "null expr" : p->expr) ,p);
     86     if (p->source != NULL) {
     87        fprintf(stderr,"line %d",p->source->line);
     88     };
     89     if (p->inverted) fprintf(stderr," predicate inverted !");
     90     fprintf(stderr,"\n");
     91     for (i=0; i<depth ; i++) {
     92       fprintf(stderr,"  ");
     93     };
     94     fprintf(stderr,"scontext: ");
     95     dumpset(p->scontext[1]);
     96     for (i=0; i<depth ; i++) {
     97       fprintf(stderr,"  ");
     98     };
     99     fprintf(stderr,"tcontext: ");
    100     preorder(p->tcontext);
    101     fprintf(stderr,"\n");
    102   };
    103   fprintf(stderr,"\n");
    104   if (p->down != NULL) {
    105     dumppred1(depth+1,p->down);
    106   };
    107   if (p->right != NULL) {
    108     dumppred1(depth,p->right);
    109   };
    110 }
    111 
    112 #ifdef __USE_PROTOS
    113 void dumppred(Predicate *p)
    114 #else
    115 void dumppred(p)
    116   Predicate     *p;
    117 #endif
    118 {
    119   fprintf(stderr,"---------------------------------\n");
    120   dumppred1(0,p);
    121   fprintf(stderr,"\n");
    122 }
    123 
    124 #ifdef __USE_PROTOS
    125 void dumppredtree(Predicate *p)
    126 #else
    127 void dumppredtree(p)
    128   Predicate     *p;
    129 #endif
    130 {
    131   fprintf(stderr,"predicate k=%d \"%s\" line %d\n",p->k,p->expr,p->source->line);
    132   dumpset(p->scontext[1]);
    133 }
    134 
    135 #ifdef __USE_PROTOS
    136 void dumppredexpr(Predicate *p)
    137 #else
    138 void dumppredexpr(p)
    139   Predicate     *p;
    140 #endif
    141 {
    142   fprintf(stderr,"    pred expr \"%s\"\n",p->expr);
    143 }
    144 
    145 #ifdef __USE_PROTOS
    146 void dt(Tree *t)
    147 #else
    148 void dt(t)
    149   Tree  *t;
    150 #endif
    151 {
    152   MR_dumpTreeF(stderr,0,t,5);
    153 }
    154 
    155 #ifdef __USE_PROTOS
    156 void d(Node * p)
    157 #else
    158 void d(p)
    159   Node *    p;
    160 #endif
    161 {
    162 
    163   Junction      *j;
    164   RuleRefNode   *r;
    165   TokNode       *t;
    166   ActionNode    *a;
    167 
    168   if (p==NULL) {
    169     fprintf(stderr,"dumpNode: Node is NULL");
    170     return;
    171   };
    172 
    173   switch (p->ntype) {
    174     case nJunction :
    175       j = (Junction *) p;
    176       fprintf(stderr, "Junction (#%d in rule %s line %d) ",j->seq,j->rname,j->line);
    177       if (j->guess) fprintf(stderr,"guess block ");
    178       switch (j->jtype ) {
    179         case aSubBlk :
    180           fprintf(stderr,"aSubBlk");
    181           break;
    182         case aOptBlk :
    183           fprintf(stderr,"aOptBlk");
    184           break;
    185         case aLoopBegin :
    186           fprintf(stderr,"aLoopBeginBlk");
    187           break;
    188         case aLoopBlk :
    189           fprintf(stderr,"aLoopBlk");
    190           break;
    191         case aPlusBlk :
    192           fprintf(stderr,"aPlusBlk");
    193           break;
    194         case EndBlk :
    195           fprintf(stderr,"EndBlk");
    196           break;
    197         case RuleBlk :
    198           fprintf(stderr,"RuleBlk");
    199           break;
    200         case Generic :
    201           fprintf(stderr,"Generic");
    202           break;
    203         case EndRule :
    204           fprintf(stderr,"EndRule");
    205           break;
    206       };
    207       if (j->halt) fprintf(stderr,"  halt!");
    208       if (j->p1) fprintf(stderr," p1 valid");
    209       if (j->p2) {
    210         if (j->p2->ntype == nJunction) {
    211            fprintf(stderr," (p2=#%d)",( (Junction *) j->p2)->seq);
    212         } else {
    213            fprintf(stderr," (p2 valid)");
    214         };
    215       };
    216 	  if (j->ignore) fprintf(stderr, " ignore/plus-block-bypass");
    217       if (j->fset != NULL && set_deg(*j->fset) != 0) {
    218          fprintf(stderr,"\nfset:\n");
    219          dumpset(*j->fset);
    220       };
    221       if (j->ftree != NULL) {
    222          fprintf(stderr,"\nftree:\n");
    223          preorder(j->ftree);
    224       };
    225       fprintf(stderr,"\n");
    226       break;
    227     case nRuleRef :
    228        r = (RuleRefNode *) p;
    229        fprintf(stderr, "RuleRefNode (in rule %s line %d) to rule %s\n", r->rname,r->line,r->text);
    230        break;
    231     case nToken :
    232        t = (TokNode *) p;
    233        fprintf(stderr, "TokNode (in rule %s line %d) token %s\n",t->rname,t->line,TerminalString(t->token));
    234        break;
    235     case nAction :
    236        a =(ActionNode *) p;
    237        if (a->is_predicate) {
    238          fprintf(stderr, "Predicate (in rule %s line %d) %s",a->rname,a->line,a->action);
    239          if (a->inverted) fprintf(stderr," action inverted !");
    240          if (a->guardpred != NULL) {
    241            fprintf(stderr," guarded");
    242            dumppredexpr(a->guardpred);
    243            if (a->ampersandPred) {
    244              fprintf(stderr," \"&&\" style");
    245            } else {
    246              fprintf(stderr," \"=>\" style");
    247            };
    248          };
    249          if (a->predEntry != NULL) fprintf(stderr," predEntry \"%s\" ",a->predEntry->str);
    250          fprintf(stderr,"\n");
    251        } else if (a->init_action) {
    252          fprintf(stderr, "Init-Action (in rule %s line %d) %s\n",a->rname,a->line,a->action);
    253        } else {
    254          fprintf(stderr, "Action (in rule %s line %d) %s\n",a->rname,a->line,a->action);
    255        };
    256        break;
    257    };
    258 }
    259 
    260 #ifdef __USE_PROTOS
    261 Node * dp1(Node * p)
    262 #else
    263 Node * dp1(p)
    264   Node *    p;
    265 #endif
    266 {
    267   Node  *result=NULL;
    268 
    269   if (p->ntype == nJunction) {
    270     result=( (Junction *) p )->p1;
    271     d(result);
    272   } else {
    273     fprintf(stderr,"dp1: Not a Junction node");
    274   };
    275   return result;
    276 }
    277 
    278 #ifdef __USE_PROTOS
    279 Node * dp2(Node * p)
    280 #else
    281 Node * dp2(p)
    282   Node *    p;
    283 #endif
    284 {
    285   Node  *result=NULL;
    286 
    287   if (p->ntype == nJunction) {
    288     result=( (Junction *) p )->p2;
    289     d(result);
    290   } else {
    291     fprintf(stderr,"dp2: Not a Junction node");
    292   };
    293   return result;
    294 }
    295 
    296 #ifdef __USE_PROTOS
    297 Node * dn(Node * p)
    298 #else
    299 Node * dn(p)
    300   Node *    p;
    301 #endif
    302 
    303 {
    304   Node  *result=NULL;
    305 
    306   if (p->ntype == nRuleRef) {
    307     result=( (RuleRefNode *)p )->next;
    308   } else if (p->ntype == nAction) {
    309     result=( (ActionNode *)p )->next;
    310   } else if (p->ntype == nToken) {
    311     result=( (TokNode *)p )->next;
    312   } else {
    313     fprintf(stderr,"No next field: Neither a RuleRefNode, ActionNode, nor TokNode");
    314   };
    315   if (result != NULL) d(result);
    316   return result;
    317 }
    318 
    319 #ifdef __USE_PROTOS
    320 void df(Node * p)
    321 #else
    322 void df(p)
    323   Node *    p;
    324 #endif
    325 {
    326   int       count=0;
    327   Node      *next;
    328 
    329   fprintf(stderr,"\n#%d ",++count);
    330   d(p);
    331 
    332   for (next=p; next != NULL && !isEndRule(next) ; ) {
    333     fprintf(stderr,"#%d ",++count);
    334     if (next->ntype == nJunction) {
    335       next=dp1(next);
    336     } else {
    337       next=dn(next);
    338     };
    339   };
    340 }
    341 
    342 #ifdef __USE_PROTOS
    343 Node * dfn(Node * p,int target)
    344 #else
    345 Node * dfn(p,target)
    346   Node *    p;
    347   int       target;
    348 #endif
    349 {
    350   Node      *result=NULL;
    351   int       count=0;
    352   Node      *next;
    353 
    354   fprintf(stderr,"#%d ",++count);
    355   d(p);
    356 
    357   for (next=p; next != NULL && !isEndRule(next) ; ) {
    358     fprintf(stderr,"#%d ",++count);
    359     if (next->ntype == nJunction) {
    360       next=dp1(next);
    361     } else {
    362       next=dn(next);
    363     };
    364     if (count == target) {
    365       result=next;
    366       break;
    367     };
    368   };
    369   return result;
    370 }
    371 
    372 
    373 static int findnodeMatch;
    374 
    375 #ifdef __USE_PROTOS
    376 Junction *findnode1(Node *n)
    377 #else
    378 Junction *findnode1(n)
    379   Node  *n;
    380 #endif
    381 {
    382    Node         *next;
    383    Junction     *j;
    384    Junction     *match;
    385 
    386    if (n == NULL) return NULL;
    387    if (n->ntype == nJunction) {
    388      j=(Junction *) n;
    389      if (j->seq == findnodeMatch) return j;
    390      if (j->jtype == EndRule) return NULL;
    391      if (j->jtype != RuleBlk && j->jtype != EndBlk) {
    392        if (j->p2 != NULL && !j->ignore) {
    393           match=findnode1(j->p2);
    394           if (match != NULL) return match;
    395        };
    396      };
    397    };
    398    next=MR_advance(n);
    399    return findnode1(next);
    400 }
    401 
    402 #ifdef __USE_PROTOS
    403 Junction *findnode(int match)
    404 #else
    405 Junction *findnode(match)
    406   int   match;
    407 #endif
    408 {
    409   Junction  *j;
    410   Junction  *result=NULL;
    411 
    412   findnodeMatch=match;
    413 
    414   for (j=SynDiag; j != NULL; j=(Junction *)j->p2) {
    415     require (j->ntype == nJunction && j->jtype == RuleBlk,"Not a rule block");
    416     result=findnode1( (Node *) j);
    417     if (result != NULL) break;
    418   };
    419   if (result != NULL) {
    420     d( (Node *) result);
    421   };
    422   return result;
    423 }
    424