|
|
1.1 ! root 1: /* Match rules with nonterminals for bison, ! 2: Copyright (C) 1984 Bob Corbett and Free Software Foundation, Inc. ! 3: ! 4: BISON is distributed in the hope that it will be useful, but WITHOUT ANY ! 5: WARRANTY. No author or distributor accepts responsibility to anyone ! 6: for the consequences of using it or for whether it serves any ! 7: particular purpose or works at all, unless he says so in writing. ! 8: Refer to the BISON General Public License for full details. ! 9: ! 10: Everyone is granted permission to copy, modify and redistribute BISON, ! 11: but only under the conditions described in the BISON General Public ! 12: License. A copy of this license is supposed to have been given to you ! 13: along with BISON so you can know your rights and responsibilities. It ! 14: should be in a file named COPYING. Among other things, the copyright ! 15: notice and this notice must be preserved on all copies. ! 16: ! 17: In other words, you are welcome to use, share and improve this program. ! 18: You are forbidden to forbid anyone else to use, share and improve ! 19: what you give them. Help stamp out software-hoarding! */ ! 20: ! 21: /* set_derives finds, for each variable (nonterminal), which rules can derive it. ! 22: It sets up the value of derives so that ! 23: derives[i - ntokens] points to a vector of rule numbers, terminated with a zero. */ ! 24: ! 25: #include <stdio.h> ! 26: #include "new.h" ! 27: #include "types.h" ! 28: #include "gram.h" ! 29: ! 30: ! 31: short **derives; ! 32: ! 33: ! 34: set_derives() ! 35: { ! 36: register int i; ! 37: register int lhs; ! 38: register shorts *p; ! 39: register short *q; ! 40: register shorts **dset; ! 41: register shorts *delts; ! 42: ! 43: dset = NEW2(nvars, shorts *) - ntokens; ! 44: delts = NEW2(nrules + 1, shorts); ! 45: ! 46: p = delts; ! 47: for (i = nrules; i > 0; i--) ! 48: { ! 49: lhs = rlhs[i]; ! 50: p->next = dset[lhs]; ! 51: p->value = i; ! 52: dset[lhs] = p; ! 53: p++; ! 54: } ! 55: ! 56: derives = NEW2(nvars, short *) - ntokens; ! 57: q = NEW2(nvars + nrules, short); ! 58: ! 59: for (i = ntokens; i < nsyms; i++) ! 60: { ! 61: derives[i] = q; ! 62: p = dset[i]; ! 63: while (p) ! 64: { ! 65: *q++ = p->value; ! 66: p = p->next; ! 67: } ! 68: *q++ = -1; ! 69: } ! 70: ! 71: #ifdef DEBUG ! 72: print_derives(); ! 73: #endif ! 74: ! 75: FREE(dset + ntokens); ! 76: FREE(delts); ! 77: } ! 78: ! 79: ! 80: free_derives() ! 81: { ! 82: FREE(derives[ntokens]); ! 83: FREE(derives + ntokens); ! 84: } ! 85: ! 86: ! 87: ! 88: #ifdef DEBUG ! 89: ! 90: print_derives() ! 91: { ! 92: register int i; ! 93: register short *sp; ! 94: ! 95: extern char **tags; ! 96: ! 97: printf("\n\n\nDERIVES\n\n"); ! 98: ! 99: for (i = ntokens; i < nsyms; i++) ! 100: { ! 101: printf("%s derives", tags[i]); ! 102: for (sp = derives[i]; *sp > 0; sp++) ! 103: { ! 104: printf(" %d", *sp); ! 105: } ! 106: putchar('\n'); ! 107: } ! 108: ! 109: putchar('\n'); ! 110: } ! 111: ! 112: #endif ! 113:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.