/* Edits: * 06-Dec-80 Broken out of y4.c, impure data in y4imp.c. * 18-Dec-80 ZAPFILE not used for decus compiler, fmkdl() used. */ # include "y4.h" void callopt( ) { register i, * p, j, k, * q; /* read the arrays from tempfile and set parameters */ if ( ( finput = fopen( TEMPNAME, "r" ) ) == NULL ) error( "optimizer cannot open tempfile" ); pgo[ 0 ] = 0; yypact[ 0 ] = 0; nstate = 0; nnonter = 0; for ( ; ; ) { switch ( gtnm( ) ) { case '\n' : yypact[ ++nstate ] = ( --pmem ) - mem0; case ',' : continue ; case '$' : break ; default : error( "bad tempfile" ); } break ; } yypact[ nstate ] = yypgo[ 0 ] = ( --pmem ) - mem0; for ( ; ; ) { switch ( gtnm( ) ) { case '\n' : yypgo[ ++nnonter ] = pmem - mem0; case '\r' : case ',' : continue ; case -1 : /* EOF */ break ; default : error( "bad tempfile" ); } break ; } yypgo[ nnonter-- ] = ( --pmem ) - mem0; for ( i = 0; i < nstate; ++i ) { k = 32000; j = 0; q = mem0 + yypact[ i + 1 ]; for ( p = mem0 + yypact[ i ]; p < q; p += 2 ) { if ( *p > j ) j = *p; if ( *p < k ) k = *p; } if ( k <= j ) { /* nontrivial situation */ /* temporarily, kill this for compatibility j -= k; j is now the range */ if ( k > maxoff ) maxoff = k; } greed[ i ] = ( yypact[ i + 1 ] - yypact[ i ] ) + 2 * j; if ( j > maxspr ) maxspr = j; } /* initialize ggreed table */ for ( i = 1; i <= nnonter; ++i ) { ggreed[ i ] = 1; j = 0; /* minimum entry index is always 0 */ q = mem0 + yypgo[ i + 1 ] - 1; for ( p = mem0 + yypgo[ i ]; p < q; p += 2 ) { ggreed[ i ] += 2; if ( *p > j ) j = *p; } ggreed[ i ] = ggreed[ i ] + 2 * j; if ( j > maxoff ) maxoff = j; } /* now, prepare to put the shift actions into the a array */ for ( i = 0; i < ACTSIZE; ++i ) yyact[ i ] = 0; maxa = yyact; for ( i = 0; i < nstate; ++i ) { if ( greed[ i ] == 0 && adb > 1 ) fprintf( ftable, "State %d: null\n", i ); pa[ i ] = YYFLAG1; } while ( ( i = nxti( ) ) != NOMORE ) { if ( i >= 0 ) stin( i ); else gin( -i ); } if ( adb > 2 ) { /* print a array */ for ( p = yyact; p <= maxa; p += 10 ) { fprintf( ftable, "%4d ", p - yyact ); for ( i = 0; i < 10; ++i ) fprintf( ftable, "%4d ", p[ i ] ); fprintf( ftable, "\n" ); } } /* write out the output appropriate to the language */ aoutput( ); osummary( ); fclose( finput ); ZAPFILE( TEMPNAME ); }