|
|
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: register i; ! 74: ! 75: if( verbose ) ! 76: fprintf(listout, "\n\nParsing action table:\n\n"); ! 77: for(i=0; i<nstates; i++) ! 78: outstate(i); ! 79: } ! 80: ! 81: outstate(n) ! 82: { ! 83: extern yydefact, yypact; ! 84: register i, k; ! 85: register struct state *stp; ! 86: int size, max, errshift, pno, maxp, j, l; ! 87: struct lset shls, rdls; ! 88: struct actn rdact[MAXREDS], act; ! 89: ! 90: stp = &states[n]; ! 91: zerolset(&shls); ! 92: for(i=0; i<stp->s_tgo; i++) ! 93: setbit(&shls, stp->s_tgos[i].tg_trm); ! 94: max = 0; ! 95: maxp = -1; ! 96: for(i=k=0; i<stp->s_nred; i++) { ! 97: pno = stp->s_reds[i].rd_prod->p_prodno; ! 98: copylset(&rdls, stp->s_reds[i].rd_lset); ! 99: resolve(n, i, &shls, &rdls); ! 100: size = 0; ! 101: for(j=first(&rdls); j>=0; j=next(&rdls, j)) { ! 102: for(l=0; l<k; l++) ! 103: if( rdact[l].a_chr==j ) { ! 104: redred(n, pno, rdact[l].a_no&YYAMASK, j); ! 105: goto nextj; /* C needs next <var> */ ! 106: } ! 107: bounded(l, MAXREDS, "reductions"); ! 108: rdact[k].a_chr = j; ! 109: rdact[k++].a_no = (YYREDACT<<YYACTSH) | pno; ! 110: size++; ! 111: nextj: ! 112: ; ! 113: } ! 114: if( size>max ) { ! 115: max = size; ! 116: maxp = pno; ! 117: } ! 118: } ! 119: if( bit(&shls, ERRNO) || maxp==0 ) /* shift on error or accept */ ! 120: maxp = -1; ! 121: ! 122: /* count total number of actions */ ! 123: size = k + lcount(&shls) + !bit(&shls,ERRNO); /* shifts+reds+default */ ! 124: if( maxp >= 0 ) { ! 125: size -= max; ! 126: yydefact += max; ! 127: } ! 128: yypact += size; ! 129: act.a_chr = size; ! 130: act.a_no = (YYPACTION<<YYACTSH) | n; ! 131: if( verbose ) ! 132: fprintf(listout, "State %d (size %d):\n\n", n, size); ! 133: fwrite(&act, sizeof act, 1, optout); ! 134: ! 135: /* now have shifts in shls redns in rdact */ ! 136: ! 137: /* output shifts */ ! 138: for(j=0; j<stp->s_tgo; j++) { ! 139: if( !bit(&shls, i = stp->s_tgos[j].tg_trm) ) ! 140: continue; ! 141: if( i==ERRNO ) { /* will be made default */ ! 142: errshift = stp->s_tgos[j].tg_st; ! 143: continue; ! 144: } ! 145: act.a_chr = i; ! 146: act.a_no = (YYSHIFTACT<<YYACTSH) | stp->s_tgos[j].tg_st; ! 147: wract(&act); ! 148: } ! 149: ! 150: /* output reductions */ ! 151: for(i=0; i<k; i++) { ! 152: if( (pno = rdact[i].a_no&YYAMASK) == maxp ) ! 153: continue; ! 154: if( pno==0 ) /* $accept -> start $end . */ ! 155: rdact[i].a_no = YYACCEPTACT<<YYACTSH; ! 156: wract(&rdact[i]); ! 157: } ! 158: ! 159: /* default action */ ! 160: act.a_chr = YYOTHERS; ! 161: if( bit(&shls, ERRNO) ) { ! 162: act.a_no = (YYSHIFTACT<<YYACTSH) | errshift; ! 163: } else if( maxp>=0 ) ! 164: act.a_no = YYREDACT<<YYACTSH | maxp; ! 165: else ! 166: act.a_no = (YYERRACT<<YYACTSH); ! 167: wract(&act); ! 168: } ! 169: ! 170: wract(actp) ! 171: register struct actn *actp; ! 172: { ! 173: register unsigned actn; ! 174: actn = actp->a_no>>YYACTSH; ! 175: if( verbose ) { ! 176: fprintf(listout, "\t%s\t%s", actp->a_chr==YYOTHERS?".": ! 177: trmptr[actp->a_chr]->s_name, actns[actn]); ! 178: if( actn<=YYREDACT ) ! 179: fprintf(listout, "\t%d", actp->a_no&YYAMASK); ! 180: fprintf(listout, "\n"); ! 181: } ! 182: fwrite(actp, sizeof *actp, 1, optout); ! 183: } ! 184: ! 185: lcount(lp) ! 186: struct lset *lp; ! 187: { ! 188: register n, count; ! 189: register unsigned char *ucp; ! 190: extern unsigned char bcount[]; ! 191: ! 192: count = 0; ! 193: ucp = lp->l_bits; ! 194: n = LSETSIZE; ! 195: do { ! 196: count += bcount[*ucp++]; ! 197: } while (--n); ! 198: return(count); ! 199: } ! 200: ! 201: setdiff(ld, ls) ! 202: struct lset *ld, *ls; ! 203: { ! 204: register n; ! 205: register unsigned char *udcp, *uscp; ! 206: ! 207: n = LSETSIZE; ! 208: udcp = ld->l_bits; ! 209: uscp = ls->l_bits; ! 210: do { ! 211: *udcp++ &= ~ *uscp++; ! 212: } while (--n); ! 213: } ! 214: ! 215: setunion(ld, ls) ! 216: struct lset *ld, *ls; ! 217: { ! 218: register n; ! 219: register unsigned char *udcp, *uscp; ! 220: ! 221: n = LSETSIZE; ! 222: udcp = ld->l_bits; ! 223: uscp = ls->l_bits; ! 224: do { ! 225: *udcp++ |= *uscp++; ! 226: } while (--n); ! 227: } ! 228: ! 229: setint(ld, ls) ! 230: struct lset *ld, *ls; ! 231: { ! 232: register n; ! 233: register unsigned char *udcp, *uscp; ! 234: ! 235: n = LSETSIZE; ! 236: udcp = ld->l_bits; ! 237: uscp = ls->l_bits; ! 238: do { ! 239: *udcp++ &= *uscp++; ! 240: } while (--n); ! 241: } ! 242: ! 243: copylset(ld, ls) ! 244: struct lset *ld, *ls; ! 245: { ! 246: register n; ! 247: register unsigned char *udcp, *uscp; ! 248: ! 249: n = LSETSIZE; ! 250: udcp = ld->l_bits; ! 251: uscp = ls->l_bits; ! 252: do { ! 253: *udcp++ = *uscp++; ! 254: } while (--n); ! 255: } ! 256: ! 257: zerolset(ld) ! 258: struct lset *ld; ! 259: { ! 260: register n; ! 261: register unsigned char *udcp; ! 262: ! 263: n = LSETSIZE; ! 264: udcp = ld->l_bits; ! 265: do { ! 266: *udcp++ = 0; ! 267: } while (--n); ! 268: } ! 269: ! 270: resolve(sno, p, sls, rls) ! 271: int p; ! 272: struct lset *sls, *rls; ! 273: { ! 274: register i; ! 275: struct lset cls; ! 276: int todo; ! 277: struct prod *pp; ! 278: struct sym *tsp; ! 279: ! 280: copylset(&cls, sls); ! 281: setint(&cls, rls); ! 282: pp = states[sno].s_reds[p].rd_prod; ! 283: for(i=first(&cls); i>=0; i=next(&cls,i) ) { /* conflict on term i */ ! 284: tsp = trmptr[i]; ! 285: if( tsp->s_ass<=UNASSOC || pp->p_ass<=UNASSOC ) { ! 286: shiftred(sno, pp->p_prodno, i); ! 287: clrbit(rls, i); ! 288: continue; ! 289: /* conflict resolved in favour of shift */ ! 290: } ! 291: if( pp->p_prc > tsp->s_prc ) ! 292: todo = LASSOC; ! 293: else if( pp->p_prc < tsp->s_prc ) ! 294: todo = RASSOC; ! 295: else ! 296: todo = tsp->s_ass; ! 297: switch( todo ) { ! 298: case LASSOC: /* reduce */ ! 299: clrbit(sls, i); ! 300: break; ! 301: ! 302: case RASSOC: ! 303: clrbit(rls, i); ! 304: break; ! 305: ! 306: case UNASSOC: /* non-self associating op */ ! 307: clrbit(rls, i); ! 308: clrbit(sls, i); ! 309: break; ! 310: } ! 311: } ! 312: } ! 313: ! 314: shiftred(sno, pn, tok) ! 315: { ! 316: register i; ! 317: struct state *stp; ! 318: ! 319: stp = &states[sno]; ! 320: ++nsrconf; ! 321: if( !verbose ) ! 322: return; ! 323: for(i=0; i<stp->s_tgo; i++) ! 324: if( stp->s_tgos[i].tg_trm==tok ) ! 325: break; ! 326: fprintf(listout, "State %d: Shift/Reduce conflict ", sno); ! 327: fprintf(listout, "(shift %d, red'n %d) on %s\n", ! 328: stp->s_tgos[i].tg_st, pn, trmptr[tok]->s_name); ! 329: } ! 330: ! 331: redred(sno, pn1, pn2, tok) ! 332: { ! 333: struct state *stp; ! 334: ! 335: stp = &states[sno]; ! 336: ++nrrconf; ! 337: if( !verbose ) ! 338: return; ! 339: fprintf(listout, "State %d: Reduce/Reduce conflict ", sno); ! 340: fprintf(listout, "(red'n %d, red'n %d) on %s\n", ! 341: pn1, pn2, trmptr[tok]->s_name); ! 342: } ! 343: ! 344: clrbit(lp, n) ! 345: struct lset *lp; ! 346: register n; ! 347: { ! 348: register unsigned char *ucp; ! 349: ! 350: ucp = lp->l_bits; ! 351: ucp[n>>LOGCHAR] &= ~( 01 << (n & (NBCHAR-1)) ); ! 352: } ! 353: ! 354: setbit(lp, n) ! 355: struct lset *lp; ! 356: register n; ! 357: { ! 358: register unsigned char *ucp; ! 359: ! 360: ucp = lp->l_bits; ! 361: ucp[n>>LOGCHAR] |= 01 << (n & (NBCHAR-1)); ! 362: } ! 363: ! 364: bit(lp, n) ! 365: struct lset *lp; ! 366: register n; ! 367: { ! 368: register unsigned char *ucp; ! 369: ! 370: ucp = lp->l_bits; ! 371: return( (ucp[n>>LOGCHAR] >> (n&(NBCHAR-1))) & 01 ); ! 372: } ! 373: ! 374: first(lp) ! 375: struct lset *lp; ! 376: { ! 377: return(next(lp,-1)); ! 378: } ! 379: ! 380: next(lp, n) ! 381: struct lset *lp; ! 382: register n; ! 383: { ! 384: register w; ! 385: register unsigned char *ucp; ! 386: extern char ltab[]; ! 387: ! 388: if( ++n >= LSETSIZE*NBCHAR ) ! 389: return(-1); ! 390: ucp = lp->l_bits; ! 391: w = ucp[n >> LOGCHAR]; ! 392: w &= ~ ( (01 << (n&(NBCHAR-1))) - 1); ! 393: n >>= LOGCHAR; ! 394: while (w == 0) { ! 395: if ( ++n >= LSETSIZE ) ! 396: return(-1); ! 397: w = ucp[n]; ! 398: } ! 399: return( (n<<LOGCHAR) + ltab[w] ); ! 400: } ! 401: ! 402: struct ntgo * ! 403: findnt(stp, nt) ! 404: register struct state *stp; ! 405: { ! 406: register i; ! 407: ! 408: for(i=0; i<stp->s_ntgo; i++ ) ! 409: if( stp->s_ntgos[i].ng_nt==nt ) ! 410: return( &stp->s_ntgos[i] ); ! 411: yyerror(NLNO|FATAL, "oops in findnt"); ! 412: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.