# include # include # include "size.h" # include "def.h" extern char token_name[MaxK][Kleng]; extern char type_name[MaxP][Pleng]; 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_name[ptr->name.nvalue], token_name[ptr->name.nvalue]); if (ptr->name.nvalue<0) fprintf(output, "%s ", type_name[-(ptr->name.nvalue)], type_name[-(ptr->name.nvalue)]); if (ptr->name.nvalue==0) fprintf(output, "(undefined name) "); break; }; case SYMBOL: { /* not implemented */ break; }; default: { break; }; } }