# include # include # include # include "def.h" # include "size.h" extern int line_num; extern struct udchain * token_uchain[MaxK]; extern struct udchain * type_dchain[MaxP]; extern struct udchain * type_uchain[MaxP]; extern char token_name[MaxK][Kleng]; extern char type_name[MaxP][Pleng]; extern int token_num; extern int type_num; extern FILE * output; void dmark(union Node * ptr, int rule_id) { struct udchain * Pdptr; Pdptr = (struct udchain *)malloc(sizeof(struct udchain)); Pdptr->next = NULL; Pdptr->rule_id = rule_id; type_dchain[-(ptr->name.nvalue)] = Pdptr; } void marknamelist(union Node * ptr, int rule_id) { struct udchain * uptr; struct udchain * endptr; do { if (((ptr->namelist.name)->name.nvalue) < 0) { uptr = (struct udchain *)malloc(sizeof(struct udchain)); uptr->next = NULL; uptr->rule_id = rule_id; endptr = type_uchain[-((ptr->namelist.name)->name.nvalue)]; while (endptr->next!=NULL) endptr=endptr->next; endptr->next = uptr; }; if (((ptr->namelist.name)->name.nvalue) > 0) { uptr = (struct udchain *)malloc(sizeof(struct udchain)); uptr->next = NULL; uptr->rule_id = rule_id; endptr = token_uchain[((ptr->namelist.name)->name.nvalue)]; while (endptr->next!=NULL) endptr=endptr->next; endptr->next = uptr; }; 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_name[i], type_name[i]); { int len; len=strlen(type_name[i]); if (type_name[i][len-1]=='t') if(type_name[i][len-2]=='m') if(type_name[i][len-3]=='t') if(type_name[i][len-4]=='s') fprintf(stderr, "%s\n",type_name[i]); } if (type_dchain[i]!=NULL) fprintf(output, "DEFINED in: R%04d

\n", type_dchain[i]->rule_id, type_dchain[i]->rule_id); else fprintf(stderr, "Symbol %s not defined in rules.\n", type_name[i]); if (type_uchain[i]->next!=NULL) { struct udchain * ptr; fprintf(output, "USED in: "); ptr=type_uchain[i]->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_name[i]); }; 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_name[i], token_name[i]); if (token_uchain[i]->next!=NULL) { struct udchain * ptr; fprintf(output, "USED in: "); ptr=token_uchain[i]->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_name[i]); }; }