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

编译器/解释器

开发平台:

Others

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