#include "y3.h" /* * yg2gen.3c * * Modified to make debug code conditionally compile. * 28-Aug-81 * Bob Denny */ void go2gen(int c) { /* output the gotos for nonterminal c */ int i, work, cc; struct item *p, *q; /* first, find nonterminals with gotos on c */ aryfil( temp1, nnonter+1, 0 ); temp1[c] = 1; work = 1; while( work ) { work = 0; PLOOP(0,i) { if( (cc=prdptr[i][1]-NTBASE) >= 0 ) { /* cc is a nonterminal */ if( temp1[cc] != 0 ) { /* cc has a goto on c */ cc = *prdptr[i]-NTBASE; /* thus, the left side of production i does too */ if( temp1[cc] == 0 ) { work = 1; temp1[cc] = 1; } } } } } /* now, we have temp1[c] = 1 if a goto on c in closure of cc */ #ifdef debug if( foutput!=NULL ) { fprintf( foutput, "%s: gotos on ", nontrst[c].name ); NTLOOP(i) if( temp1[i] ) fprintf( foutput, "%s ", nontrst[i].name); fprintf( foutput, "\n"); } #endif /* now, go through and put gotos into tystate */ aryfil( tystate, nstate, 0 ); SLOOP(i) { ITMLOOP(i,p,q) { if( (cc= *p->pitem) >= NTBASE ) { if( temp1[cc -= NTBASE] ) { /* goto on c is possible */ tystate[i] = amem[indgo[i]+c]; break; } } } } }