cpfir() { /* compute an array with the first of nonterminals */ int i, ch, **s, **t, changes, *p; pfirst = (struct looksets **)yalloc(nnonter+1); for (i=0;i<=nnonter;i++) { aryfil( wsets[i].ws, tbitset, 0 ); t = pres[i+1]; for( s=pres[i]; s<t; ++s ){ /* initially fill the sets */ for( p = *s; (ch = *p) > 0 ; ++p ) { if( ch < NTBASE ) { wsets[i].ws[ch>>4] |= (1 << (ch&017) ); break; } else if( !pempty[ch-NTBASE] ) break; } }
/* put out other arrays, copy the parsers */ static void others() { extern int gen_lines; int c, i, j; int tmpline; finput = fopen(parser, "r"); if (finput == NULL) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * This error message is issued when yacc can not find * the parser to be copied. */ error(gettext( "cannot find parser %s"), parser); warray(L"yyr1", levprd, nprod); aryfil(temp1, nprod, 0); /* had_act[i] is either 1 or 0 */ PLOOP(1, i) temp1[i] = ((prdptr[i+1] - prdptr[i]-2) << 1) | had_act[i]; warray(L"yyr2", temp1, nprod); aryfil(temp1, nstate, -10000000); TLOOP(i) for (j = tstates[i]; j != 0; j = mstates[j]) temp1[j] = tokset[i].value; NTLOOP(i) for (j = ntstates[i]; j != 0; j = mstates[j]) temp1[j] = -i; warray(L"yychk", temp1, nstate); warray(L"yydef", defact, nstate); if ((fdebug = fopen(DEBUGNAME, "r")) == NULL) error("cannot open yacc.debug"); while ((c = getwc(fdebug)) != EOF) (void) putwc(c, ftable); (void) fclose(fdebug); ZAPFILE(DEBUGNAME); if (gen_lines) (void) fprintf(ftable, "# line\t1 \"%s\"\n", parser); tmpline = 1; /* copy parser text */ while ((c = getwc(finput)) != EOF) { if (c == '\n') tmpline++; if (c == L'$') { if ((c = getwc(finput)) != L'A') (void) putwc(L'$', ftable); else { /* copy actions */ tmpline++; faction = fopen(ACTNAME, "r"); if (faction == NULL) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * This error is issued when yacc can not open a * temporary file to be used. You do not need to * use the word 'tempfile'. You can translate it to * mean 'temporary file'. */ error(gettext( "cannot open action tempfile")); while ((c = getwc(faction)) != EOF) (void) putwc(c, ftable); (void) fclose(faction); if (gen_lines) (void) fprintf(ftable, "\n# line\t%d \"%s\"", tmpline, parser); ZAPFILE(ACTNAME); c = getwc(finput); } } (void) putwc(c, ftable); } (void) fclose(ftable); }
static void mktbls() { int i; size = ntoksz + nnontersz +1; if (size < nstatesz) size = nstatesz; if (size < new_memsize) size = new_memsize; amem = (int *) malloc(sizeof (int) * new_actsize); psmem = (ITEM *) malloc(sizeof (ITEM) * new_pstsize); if ((psmem == NULL) || (amem == NULL)) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * This error happens when yacc could not allocate * initial memory to be used for internal tables. * * You may just translate this as: * 'Could not allocate internally used memory.' */ error(gettext( "couldn't allocate initial table")); zzmemsz = psmem; memp = amem; /* * For lkst */ #define INIT_LSIZE nnontersz*LKFACTOR tmp_lset = (int *) calloc((size_t)(TBITSET * (INIT_LSIZE+1)), sizeof (int)); if (tmp_lset == NULL) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * Yacc could not allocate memory for table named lookset. * Do not translate 'lookset'. * * You may just translate this as: * 'Could not allocate internally used memory.' */ error(gettext( "could not allocate lookset array")); lkst = (LOOKSETS *) malloc(sizeof (LOOKSETS) * (INIT_LSIZE + 1)); for (i = 0; i <= INIT_LSIZE; ++i) lkst[i].lset = tmp_lset + TBITSET * i; tmp_lset = NULL; /* * For wsets */ tmp_lset = (int *) calloc((size_t)(TBITSET * (nnontersz+1)), sizeof (int)); if (tmp_lset == NULL) error(gettext( "could not allocate lookset array")); wsets = (WSET *) malloc(sizeof (WSET) * (nnontersz + 1)); for (i = 0; i <= nnontersz; ++i) wsets[i].ws.lset = tmp_lset + TBITSET * i; tmp_lset = NULL; clset.lset = (int *)malloc(sizeof (int)*TBITSET); tstates = (int *)malloc(sizeof (int)*(ntoksz + 1)); ntstates = (int *)malloc(sizeof (int)*(nnontersz + 1)); temp1 = (int *)malloc(sizeof (int)*size); pres = (int ***)malloc(sizeof (int **)*(nnontersz + 2)); pfirst = (LOOKSETS **)malloc(sizeof (LOOKSETS *)*(nnontersz + 2)); pempty = (int *)malloc(sizeof (int)*(nnontersz + 1)); pstate = (ITEM **)malloc(sizeof (ITEM *)*(nstatesz+2)); tystate = (int *)malloc(sizeof (int)*nstatesz); indgo = (int *)malloc(sizeof (int)*nstatesz); mstates = (int *)malloc(sizeof (int)*nstatesz); defact = (int *)malloc(sizeof (int)*nstatesz); if ((lkst == NULL) || (wsets == NULL) || (tstates == NULL) || (ntstates == NULL) || (temp1 == NULL) || (pres == NULL) || (pfirst == NULL) || (pempty == NULL) || (pstate == NULL) || (tystate == NULL) || (indgo == NULL) || (mstates == NULL) || (defact == NULL) || (clset.lset == NULL)) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * Do not translate mktbls(). It is a function name. * * You may just translate this as: * 'Could not allocate internally used memory.' */ error(gettext( "cannot allocate tables in mktbls()")); aryfil(ntstates, nnontersz+1, 0); aryfil(tstates, ntoksz+1, 0); wsetsz = nnontersz + 1; lsetsize = INIT_LSIZE + 1; }
output(){ /* print the output for the states */ int i, j, k, c; settab(); arrset("yyact"); for( i=0; i<nstate; ++i ){ /* output the stuff for state i */ nolook = (tystate[i]==0); closure(i); /* output actions */ aryfil( temp1, nterms+1, 0 ); for( j=0; j<cwset; ++j ){ /* look at the items */ c = *( wsets[j].pitem ); if( c>0 && c<NTBASE && temp1[c]==0 ) temp1[c] = go2(i,c); } if( i == 1 ) temp1[1] = ACCEPTCODE; /* now, we have the shifts; look at the reductions */ lastred = 0; for( j=0; j<cwset; ++j ){ c = *( wsets[j].pitem ); if( c<=0 ){ /* reduction */ lastred = -c; for( k=1; k<=nterms; ++k ){ if( ((wsets[j].ws[k>>4])&(1<<(k&017))) != 0 ) { if( temp1[k] == 0 ) temp1[k] = c; else if( temp1[k]<0 ){ /* reduce/reduce conflict */ settty(); printf("\n%d: reduce/reduce conflict (red'ns %d and %d ) on %s", i, -temp1[k], lastred, symnam(k) ); if( -temp1[k] > lastred ) temp1[k] = -lastred; ++zzrrconf; settab(); } else { /* potential shift/reduce conflict */ switch( precftn( lastred, k ) ) { case 0: /* precedence does not apply */ settty(); printf("\n%d: shift/reduce conflict (shift %d, red'n %d) on %s", i, temp1[k], lastred, symnam(k) ); ++zzsrconf; settab(); break; case 1: /* reduce */ temp1[k] = -lastred; break; case 2: /* error, binary operator */ temp1[k] = ERRCODE; break; case 3: /* shift ... leave the entry alone */ break; } } } } } } wract(i); }
/* put out other arrays, copy the parsers */ static void others () { extern int gen_lines; int c, i, j; int tmpline; finput = fopen (parser, "r"); if (finput == NULL) /* * TRANSLATION_NOTE -- This is a message from yacc. * This message is passed to error() function. * This error message is issued when yacc can not find * the parser to be copied. */ error ("cannot find parser %s", parser); warray ("yyr1", levprd, nprod); aryfil (temp1, nprod, 0); /* had_act[i] is either 1 or 0 */ /* original PLOOP(1, i) temp1[i] = ((prdptr[i+1] - prdptr[i]-2) << 1) | had_act[i]; */ PLOOP (1, i) temp1[i] = prdptr[i + 1] - prdptr[i] - 2; warray ("yyr2", temp1, nprod); aryfil (temp1, nstate, -1000); TLOOP (i) for (j = tstates[i]; j != 0; j = mstates[j]) temp1[j] = tokset[i].value; NTLOOP (i) for (j = ntstates[i]; j != 0; j = mstates[j]) temp1[j] = -i; warray ("yychk", temp1, nstate); warray ("yydef", defact, nstate); fclose (ftable); fclose (fudecl); if ((fdebug = fopen (DEBUGNAME, "r")) == NULL) error ("cannot open yacc.debug"); while ((c = getc (fdebug)) != EOF) (void) putc (c, fsppout); (void) fclose (fdebug); ZAPFILE (DEBUGNAME); if (gen_lines) (void) fprintf (fsppout, "# line\t1 \"%s\"\n", parser); tmpline = 1; /* copy parser text */ while ((c = getc (finput)) != EOF) { if (c == '\n') tmpline++; if (c == '$') { if ((c = getc (finput)) == 'A') { /* Replace $A macro by the user declarations. */ fudecl = fopen (UDFILE, "r"); if (fudecl == NULL) error ("cannot reopen user declarations tempfile"); while ((c = getc (fudecl)) != EOF) putc (c, fsppout); fclose (fudecl); ZAPFILE (UDFILE); /* Skip remainder of line following macro. */ while ((c = getc (finput)) != '\n' && c != EOF); } else if (c == 'B') { /* Replace $B macro by the parser tables. */ ftable = fopen (TABFILE, "r"); if (ftable == NULL) error ("cannot reopen parser tables tempfile"); while ((c = getc (ftable)) != EOF) putc (c, fsppout); fclose (ftable); ZAPFILE (TABFILE); /* Skip remainder of line following macro. */ while ((c = getc (finput)) != '\n' && c != EOF); } else if (c == 'C') { /* Replace $C macro by user-supplied actions. */ faction = fopen (ACTNAME, "r"); if (faction == NULL) error ("cannot reopen action tempfile"); while ((c = getc (faction)) != EOF) putc (c, fsppout); fclose (faction); ZAPFILE (ACTNAME); /* Skip remainder of line following macro. */ while ((c = getc (finput)) != '\n' && c != EOF); } else { putc ('$', fsppout); putc (c, fsppout); } } else putc (c, fsppout); } fclose (fsppout); }