|
|
1.1 ! root 1: /* ! 2: * write goto table and parsing table out to temp file ! 3: * to be picked up later by the optimizer ! 4: * at this point, the tables are fit to be processed by the C parser ! 5: */ ! 6: #include "yacc.h" ! 7: #include <action.h> ! 8: ! 9: char *actns[] = { ! 10: "SHIFT", ! 11: "REDUCE", ! 12: "ACCEPT", ! 13: "ERROR" ! 14: }; ! 15: ! 16: static int *uv; ! 17: ! 18: go2out() ! 19: { ! 20: register i; ! 21: ! 22: if( verbose ) ! 23: fprintf(listout, "\n\nGoto table:\n\n"); ! 24: uv = (int *)yalloc(nstates, sizeof *uv); ! 25: rewopt(); ! 26: for(i=1; i<nnonterm; i++) ! 27: outgo2(i); ! 28: free(uv); ! 29: } ! 30: ! 31: outgo2(n) ! 32: { ! 33: extern yyredns, yygodef; ! 34: int max, sno, j; ! 35: struct sym *sp; ! 36: struct go2n g2; ! 37: ! 38: ! 39: sp = ntrmptr[n]; ! 40: for(j=0; j<sp->s_nstates; j++) ! 41: uv[j] = 0; ! 42: max = 0; ! 43: for(j=0; j<sp->s_nstates; j++) { ! 44: sno = findnt( &states[sp->s_states[j]], n+NTBASE)->ng_st; ! 45: if( ++uv[sno] > uv[max] ) ! 46: max = sno; ! 47: } ! 48: yygodef += uv[max]; ! 49: g2.from = (YYGOTO<<YYACTSH) | n; ! 50: g2.to = sp->s_nstates - uv[max] + 1; ! 51: yyredns += g2.to; ! 52: fwrite(&g2, sizeof g2, 1, optout); ! 53: if( verbose ) ! 54: fprintf(listout, "%s:\n\n", ntrmptr[n]->s_name); ! 55: for(j=0; j<sp->s_nstates; j++) { ! 56: sno = sp->s_states[j]; ! 57: if( (g2.to=findnt(&states[sno], n+NTBASE)->ng_st) == max ) ! 58: continue; ! 59: g2.from = sno; ! 60: if( verbose ) ! 61: fprintf(listout, "\t%d\t%d\n", g2.from, g2.to); ! 62: fwrite(&g2, sizeof g2, 1, optout); ! 63: } ! 64: g2.from = YYOTHERS; ! 65: g2.to = max; ! 66: fwrite(&g2, sizeof g2, 1, optout); ! 67: if( verbose ) ! 68: fprintf(listout, "\t.\t%d\n\n", max); ! 69: } ! 70: ! 71: paout() ! 72: { ! 73: struct actn *rdact; ! 74: register i; ! 75: ! 76: if (verbose) ! 77: fprintf(listout, "\n\nParsing action table:\n\n"); ! 78: ! 79: rdact = (struct actn *) yalloc (maxreds, sizeof(*rdact)); ! 80: for(i = 0; i < nstates; i++) ! 81: outstate(i, rdact); ! 82: free(rdact); ! 83: } ! 84: ! 85: outstate(n, rdact) ! 86: struct actn rdact[]; ! 87: { ! 88: extern yydefact, yypact; ! 89: register i, k; ! 90: register struct state *stp; ! 91: int size, max, errshift, pno, maxp, j, l; ! 92: struct lset shls, rdls; ! 93: struct actn act; ! 94: ! 95: stp = &states[n]; ! 96: zerolset(&shls); ! 97: for(i=0; i<stp->s_tgo; i++) ! 98: setbit(&shls, stp->s_tgos[i].tg_trm); ! 99: max = 0; ! 100: maxp = -1; ! 101: for(i=k=0; i<stp->s_nred; i++) { ! 102: pno = stp->s_reds[i].rd_prod->p_prodno; ! 103: copylset(&rdls, stp->s_reds[i].rd_lset); ! 104: resolve(n, i, &shls, &rdls); ! 105: size = 0; ! 106: for(j=first(&rdls); j>=0; j=next(&rdls, j)) { ! 107: for(l=0; l<k; l++) ! 108: if( rdact[l].a_chr==j ) { ! 109: redred(n, pno, rdact[l].a_no&YYAMASK, j); ! 110: goto nextj; /* C needs next <var> */ ! 111: } ! 112: bounded(l, maxreds, "reductions"); ! 113: rdact[k].a_chr = j; ! 114: rdact[k++].a_no = (YYREDACT<<YYACTSH) | pno; ! 115: size++; ! 116: nextj: ! 117: ; ! 118: } ! 119: if( size>max ) { ! 120: max = size; ! 121: maxp = pno; ! 122: } ! 123: } ! 124: if( bit(&shls, ERRNO) || maxp==0 ) /* shift on error or accept */ ! 125: maxp = -1; ! 126: ! 127: /* count total number of actions */ ! 128: size = k + lcount(&shls) + !bit(&shls,ERRNO); /* shifts+reds+default */ ! 129: if( maxp >= 0 ) { ! 130: size -= max; ! 131: yydefact += max; ! 132: } ! 133: yypact += size; ! 134: act.a_chr = size; ! 135: act.a_no = (YYPACTION<<YYACTSH) | n; ! 136: if( verbose ) ! 137: fprintf(listout, "State %d (size %d):\n\n", n, size); ! 138: fwrite(&act, sizeof act, 1, optout); ! 139: ! 140: /* now have shifts in shls redns in rdact */ ! 141: ! 142: /* output shifts */ ! 143: for(j=0; j<stp->s_tgo; j++) { ! 144: if( !bit(&shls, i = stp->s_tgos[j].tg_trm) ) ! 145: continue; ! 146: if( i==ERRNO ) { /* will be made default */ ! 147: errshift = stp->s_tgos[j].tg_st; ! 148: continue; ! 149: } ! 150: act.a_chr = i; ! 151: act.a_no = (YYSHIFTACT<<YYACTSH) | stp->s_tgos[j].tg_st; ! 152: wract(&act); ! 153: } ! 154: ! 155: /* output reductions */ ! 156: for(i=0; i<k; i++) { ! 157: if( (pno = rdact[i].a_no&YYAMASK) == maxp ) ! 158: continue; ! 159: if( pno==0 ) /* $accept -> start $end . */ ! 160: rdact[i].a_no = YYACCEPTACT<<YYACTSH; ! 161: wract(&rdact[i]); ! 162: } ! 163: ! 164: /* default action */ ! 165: act.a_chr = YYOTHERS; ! 166: if( bit(&shls, ERRNO) ) { ! 167: act.a_no = (YYSHIFTACT<<YYACTSH) | errshift; ! 168: } else if( maxp>=0 ) ! 169: act.a_no = YYREDACT<<YYACTSH | maxp; ! 170: else ! 171: act.a_no = (YYERRACT<<YYACTSH); ! 172: wract(&act); ! 173: } ! 174: ! 175: wract(actp) ! 176: register struct actn *actp; ! 177: { ! 178: register unsigned actn; ! 179: actn = actp->a_no>>YYACTSH; ! 180: if( verbose ) { ! 181: fprintf(listout, "\t%s\t%s", actp->a_chr==YYOTHERS?".": ! 182: trmptr[actp->a_chr]->s_name, actns[actn]); ! 183: if( actn<=YYREDACT ) ! 184: fprintf(listout, "\t%d", actp->a_no&YYAMASK); ! 185: fprintf(listout, "\n"); ! 186: } ! 187: fwrite(actp, sizeof *actp, 1, optout); ! 188: } ! 189: ! 190: lcount(lp) ! 191: struct lset *lp; ! 192: { ! 193: register n, count; ! 194: register unsigned char *ucp; ! 195: extern unsigned char bcount []; ! 196: ! 197: count = 0; ! 198: ucp = lp->l_bits; ! 199: n = LSETSIZE; ! 200: do { ! 201: count += bcount [* ucp ++]; ! 202: } while (-- n); ! 203: return count; ! 204: } ! 205: ! 206: setdiff(ld, ls) ! 207: struct lset *ld, *ls; ! 208: { ! 209: register n; ! 210: register unsigned char *udcp, *uscp; ! 211: ! 212: n = LSETSIZE; ! 213: udcp = ld->l_bits; ! 214: uscp = ls->l_bits; ! 215: do { ! 216: * udcp ++ &= ~ * uscp ++; ! 217: } while (-- n); ! 218: } ! 219: ! 220: setunion(ld, ls) ! 221: struct lset *ld, *ls; ! 222: { ! 223: register n; ! 224: register unsigned char *udcp, *uscp; ! 225: ! 226: n = LSETSIZE; ! 227: udcp = ld->l_bits; ! 228: uscp = ls->l_bits; ! 229: do { ! 230: * udcp ++ |= * uscp ++; ! 231: } while (-- n); ! 232: } ! 233: ! 234: setint(ld, ls) ! 235: struct lset *ld, *ls; ! 236: { ! 237: register n; ! 238: register unsigned char *udcp, *uscp; ! 239: ! 240: n = LSETSIZE; ! 241: udcp = ld->l_bits; ! 242: uscp = ls->l_bits; ! 243: do { ! 244: * udcp ++ &= * uscp ++; ! 245: } while (-- n); ! 246: } ! 247: ! 248: copylset(ld, ls) ! 249: struct lset *ld, *ls; ! 250: { ! 251: memcpy (ld->l_bits, ls->l_bits, sizeof (ld->l_bits)); ! 252: } ! 253: ! 254: zerolset(ld) ! 255: struct lset *ld; ! 256: { ! 257: memset (ld->l_bits, 0, sizeof (ld->l_bits)); ! 258: } ! 259: ! 260: resolve(sno, p, sls, rls) ! 261: int p; ! 262: struct lset *sls, *rls; ! 263: { ! 264: register i; ! 265: struct lset cls; ! 266: int todo; ! 267: struct prod *pp; ! 268: struct sym *tsp; ! 269: ! 270: copylset(&cls, sls); ! 271: setint(&cls, rls); ! 272: pp = states[sno].s_reds[p].rd_prod; ! 273: for(i=first(&cls); i>=0; i=next(&cls,i) ) { /* conflict on term i */ ! 274: tsp = trmptr[i]; ! 275: if( tsp->s_ass<=UNASSOC || pp->p_ass<=UNASSOC ) { ! 276: shiftred(sno, pp->p_prodno, i); ! 277: clrbit(rls, i); ! 278: continue; ! 279: /* conflict resolved in favour of shift */ ! 280: } ! 281: if( pp->p_prc > tsp->s_prc ) ! 282: todo = LASSOC; ! 283: else if( pp->p_prc < tsp->s_prc ) ! 284: todo = RASSOC; ! 285: else ! 286: todo = tsp->s_ass; ! 287: switch( todo ) { ! 288: case LASSOC: /* reduce */ ! 289: clrbit(sls, i); ! 290: break; ! 291: ! 292: case RASSOC: ! 293: clrbit(rls, i); ! 294: break; ! 295: ! 296: case UNASSOC: /* non-self associating op */ ! 297: clrbit(rls, i); ! 298: clrbit(sls, i); ! 299: break; ! 300: } ! 301: } ! 302: } ! 303: ! 304: shiftred(sno, pn, tok) ! 305: { ! 306: register i; ! 307: struct state *stp; ! 308: ! 309: stp = &states[sno]; ! 310: ++nsrconf; ! 311: if( !verbose ) ! 312: return; ! 313: for(i=0; i<stp->s_tgo; i++) ! 314: if( stp->s_tgos[i].tg_trm==tok ) ! 315: break; ! 316: fprintf(listout, "State %d: Shift/Reduce conflict ", sno); ! 317: fprintf(listout, "(shift %d, red'n %d) on %s\n", ! 318: stp->s_tgos[i].tg_st, pn, trmptr[tok]->s_name); ! 319: } ! 320: ! 321: redred(sno, pn1, pn2, tok) ! 322: { ! 323: struct state *stp; ! 324: ! 325: stp = &states[sno]; ! 326: ++nrrconf; ! 327: if( !verbose ) ! 328: return; ! 329: fprintf(listout, "State %d: Reduce/Reduce conflict ", sno); ! 330: fprintf(listout, "(red'n %d, red'n %d) on %s\n", ! 331: pn1, pn2, trmptr[tok]->s_name); ! 332: } ! 333: ! 334: clrbit(lp, n) ! 335: struct lset *lp; ! 336: register unsigned n; ! 337: { ! 338: lp->l_bits [n / CHAR_BIT] &= ~ (1 << (n & (CHAR_BIT - 1)) ); ! 339: } ! 340: ! 341: setbit(lp, n) ! 342: struct lset *lp; ! 343: register unsigned n; ! 344: { ! 345: lp->l_bits [n / CHAR_BIT] |= 1 << (n & (CHAR_BIT - 1)); ! 346: } ! 347: ! 348: bit(lp, n) ! 349: struct lset *lp; ! 350: register unsigned n; ! 351: { ! 352: return (lp->l_bits [n / CHAR_BIT] >> (n & (CHAR_BIT - 1))) & 1; ! 353: } ! 354: ! 355: first(lp) ! 356: struct lset *lp; ! 357: { ! 358: return next (lp,-1); ! 359: } ! 360: ! 361: next(lp, n) ! 362: struct lset *lp; ! 363: register unsigned n; ! 364: { ! 365: register w; ! 366: register unsigned char *ucp; ! 367: extern char ltab[]; ! 368: ! 369: if (++ n >= LSETSIZE * CHAR_BIT) ! 370: return -1; ! 371: ucp = lp->l_bits; ! 372: w = ucp [n / CHAR_BIT]; ! 373: w &= ~ ((1 << (n & (CHAR_BIT - 1))) - 1); ! 374: n /= CHAR_BIT; ! 375: while (w == 0) { ! 376: if (++ n >= LSETSIZE) ! 377: return -1; ! 378: w = ucp [n]; ! 379: } ! 380: return n * CHAR_BIT + ltab [w]; ! 381: } ! 382: ! 383: struct ntgo * ! 384: findnt(stp, nt) ! 385: register struct state *stp; ! 386: { ! 387: register i; ! 388: ! 389: for(i=0; i<stp->s_ntgo; i++ ) ! 390: if( stp->s_ntgos[i].ng_nt==nt ) ! 391: return( &stp->s_ntgos[i] ); ! 392: yyerror(NLNO|FATAL, "oops in findnt"); ! 393: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.