# include # include # include "size.h" # include "extern.h" # include "def.h" extern struct yysymbol token[MaxK]; extern struct yysymbol type[MaxP]; extern FILE *output; void unparse(union Node * ptr) { switch (ptr->com.var) { case RULELIST: { fprintf(output, "\n"); unparse(ptr->rulelist.rule); if ((ptr->rulelist.list)!= NULL) unparse(ptr->rulelist.list); break; }; case RULE: { fprintf(output, "\n%(R%04d)

\n", ptr->rule.id, ptr->rule.id); unparse(ptr->rule.lhs); fprintf(output, "\n

\n"); break; }; case LHS: { unparse(ptr->lhs.name); fprintf(output, "\n"); break; }; case RHSLIST: { unparse(ptr->rhslist.rhs); if ((ptr->rhslist.list)!= NULL) unparse(ptr->rhslist.list); break; }; case RHS: { if (ptr->rhs.namelist==NULL){ fprintf(output, "
  • \t/* empty */

    \n"); fprintf(output, "\t\t

    \n"); }; if (ptr->rhs.namelist!=NULL){ fprintf(output, "

  • \t"); unparse(ptr->rhs.namelist); fprintf(output, "

    \n"); fprintf(output, "\t\t

    \n"); }; break; }; case NAMELIST: { unparse(ptr->namelist.name); if ((ptr->namelist.list)!= NULL) unparse(ptr->namelist.list); break; }; case NAME: { if (ptr->name.nvalue>0) fprintf(output, "%s ", token[ptr->name.nvalue].name, token[ptr->name.nvalue].name); if (ptr->name.nvalue<0) fprintf(output, "%s ", type[-(ptr->name.nvalue)].name, type[-(ptr->name.nvalue)].name); if (ptr->name.nvalue==0) fprintf(output, "(undefined name) "); break; }; case SYMBOL: { /* not implemented */ break; }; default: { break; }; } }