# include # include # include # include "def.h" # include "size.h" # include "extern.h" extern int line_num; extern struct yysymbol token[MaxK]; extern struct yysymbol type[MaxP]; extern int token_num; extern int type_num; extern FILE * output; void dmark(union Node * ptr, int rule_id) { struct rchain * rptr; rptr = (struct rchain *)malloc(sizeof(struct rchain)); rptr->next = NULL; rptr->rule_id = rule_id; type[-(ptr->name.nvalue)].define.next = rptr; } void marknamelist(union Node * ptr, int rule_id) { struct rchain * rptr; struct rchain * lastptr; do { if (((ptr->namelist.name)->name.nvalue) < 0) { rptr = (struct rchain *)malloc(sizeof(struct rchain)); rptr->next = NULL; rptr->rule_id = rule_id; lastptr = &(type[-((ptr->namelist.name)->name.nvalue)].use); while (lastptr->next!=NULL) lastptr=lastptr->next; lastptr->next=rptr; }; if (((ptr->namelist.name)->name.nvalue) > 0) { rptr = (struct rchain *)malloc(sizeof(struct rchain)); rptr->next = NULL; rptr->rule_id = rule_id; lastptr = &(token[((ptr->namelist.name)->name.nvalue)].use); while (lastptr->next!=NULL) lastptr=lastptr->next; lastptr->next=rptr; }; if (((ptr->namelist.name)->name.nvalue) == 0) fprintf(stderr, "All name should be defined\n"); ptr = ptr->namelist.list; } while (ptr!=NULL); } void markrhs(union Node * ptr, int rule_id) { if (ptr->rhs.namelist!=NULL) marknamelist(ptr->rhs.namelist, rule_id); } void umark(union Node * ptr, int rule_id) { do { markrhs(ptr->rhslist.rhs, rule_id); ptr = ptr->rhslist.list; } while (ptr!=NULL); } void mark(union Node * ptr) { dmark(ptr->rule.lhs, ptr->rule.id); umark(ptr->rule.rhslist, ptr->rule.id); } void crossref(void) { int i; fprintf(output, "

\n


\n

Non-terminals in grammer rule

\n


\n

\n"); for (i=1; i<=type_num; i++) { fprintf(output, "

\n% 3d. %s

\n", i, type[i].name, type[i].name); if (type[i].define.next!=NULL) fprintf(output, "DEFINED in: R%04d

\n", type[i].define.next->rule_id, type[i].define.next->rule_id); else fprintf(stderr, "Symbol %s not defined in rules.\n", type[i].name); if (type[i].use.next!=NULL) { struct rchain * ptr; fprintf(output, "USED in: "); ptr=type[i].use.next; while(ptr!=NULL) { fprintf(output, "R%04d ", ptr->rule_id, ptr->rule_id); ptr=ptr->next; }; fprintf(output,"

\n"); } else fprintf(stderr, "Symbol %s not used in rules.\n", type[i].name); }; fprintf(output, "

\n


\n

\n

Terminals in grammer rule

\n


\n

\n"); for (i=1; i<=token_num; i++) { fprintf(output, "

\n% 3d. %s

\n", i, token[i].name, token[i].name); if (token[i].use.next!=NULL) { struct rchain * ptr; fprintf(output, "USED in: "); ptr=token[i].use.next; while(ptr!=NULL) { fprintf(output, "R%04d ", ptr->rule_id, ptr->rule_id); ptr=ptr->next; }; fprintf(output,"

\n"); } else fprintf(stderr, "Symbol %s not used in rules.\n", token[i].name); }; }