# include # include "y2.h" void cpyact( offset ) { /* copy C action to the next ; or closing } */ int brac, c, match, j, s, tok; fprintf( faction, "\n# line %d\n", lineno ); brac = 0; loop : c = unix_getc( finput ); swt : switch ( c ) { case ';' : if ( brac == 0 ) { putc( c, faction ); return; } goto lcopy; case '{' : brac++; goto lcopy; case '$' : s = 1; tok = -1; c = unix_getc( finput ); if ( c == '<' ) { /* type description */ yacc_ungetc( c ); if ( gettok( ) != TYPENAME ) error( "bad syntax on $ clause" ); tok = numbval; c = unix_getc( finput ); } if ( c == '$' ) { fprintf( faction, "yyval" ); if ( ntypes ) { /* put out the proper tag... */ if ( tok < 0 ) tok = fdtype( *prdptr[ nprod ] ); fprintf( faction, ".%s", typeset[ tok ] ); } goto loop; } if ( c == '-' ) { s = -s; c = unix_getc( finput ); } if ( isdigit( c ) ) { j = 0; while ( isdigit( c ) ) { j = j * 10 + c - '0'; c = unix_getc( finput ); } j = j * s - offset; if ( j > 0 ) { error( "Illegal use of $%d", j + offset ); } fprintf( faction, "yypvt[-%d]", -j ); if ( ntypes ) { /* put out the proper tag */ if ( j + offset <= 0 && tok < 0 ) error( "must specify type of $%d", j + offset ); if ( tok < 0 ) tok = fdtype( prdptr[ nprod ][ j + offset ] ); fprintf( faction, ".%s", typeset[ tok ] ); } goto swt; } putc( '$', faction ); if ( s < 0 ) putc( '-', faction ); goto swt; case '}' : if ( --brac ) goto lcopy; putc( c, faction ); return; case '/' : /* look for comments */ putc( c, faction ); c = unix_getc( finput ); if ( c != '*' ) goto swt; /* it really is a comment */ putc( c, faction ); c = unix_getc( finput ); while ( c != EOF ) { while ( c == '*' ) { putc( c, faction ); if ( ( c = unix_getc( finput ) ) == '/' ) goto lcopy; } putc( c, faction ); if ( c == '\n' ) ++lineno; c = unix_getc( finput ); } error( "EOF inside comment" ); case '\'' : /* character constant */ match = '\''; goto string; case '"' : /* character string */ match = '"'; string : putc( c, faction ); while ( c = unix_getc( finput ) ) { if ( c == '\\' ) { putc( c, faction ); c = unix_getc( finput ); if ( c == '\n' ) ++lineno; } else if ( c == match ) goto lcopy; else if ( c == '\n' ) error( "newline in string or char. const." ); putc( c, faction ); } error( "EOF in string or character constant" ); case -1 : /* EOF */ error( "action does not terminate" ); case '\n' : ++lineno; goto lcopy; } lcopy : putc( c, faction ); goto loop; }