159 lines
3.4 KiB
C
159 lines
3.4 KiB
C
// Copyright (c) 1993-1999 Microsoft Corporation
|
|
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include "y2.h"
|
|
|
|
void
|
|
cpyact( SSIZE_T offset)
|
|
{
|
|
/* copy C action to the next ; or closing } */
|
|
int brac, c, match, s;
|
|
SSIZE_T j, tok;
|
|
|
|
writeline(faction);
|
|
|
|
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 */
|
|
yungetc( c, finput );
|
|
if( gettok() != TYPENAME ) error( "bad syntax on $<ident> 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;
|
|
}
|