home *** CD-ROM | disk | FTP | other *** search
-
- # include "y2.h"
-
- defin( t, s )
- register char * s;
-
- {
- /* define s to be a terminal if t=0
- or a nonterminal if t=1 */
-
- register val;
-
- # ifdef debug
- fprintf( ftable, "defin t = %d s = %s ", t, s );
- # endif
-
- if ( t )
- {
- if ( ++nnonter >= NNONTERM )
- error( "too many nonterminals, limit %d", NNONTERM );
- nontrst[ nnonter ].name = cstash( s );
- # ifdef debug
- fprintf( ftable, "ret = %d\n", NTBASE + nnonter );
- # endif
- return ( NTBASE + nnonter );
- }
- /* must be a token */
- if ( ++ntokens >= NTERMS )
- error( "too many terminals, limit %d", NTERMS );
- tokset[ ntokens ].name = cstash( s );
-
- /* establish value for token */
-
- if ( s[ 0 ] == ' ' && s[ 2 ] == '\0' ) /* single character literal */
- val = s[ 1 ];
- else
- if ( s[ 0 ] == ' ' && s[ 1 ] == '\\' )
- {
- /* escape sequence */
- if ( s[ 3 ] == '\0' )
- {
- /* single character escape sequence */
- switch ( s[ 2 ] )
- {
- /* character which is escaped */
- case 'n' :
- val = '\n';
- break ;
- case 'r' :
- val = '\r';
- break ;
- case 'b' :
- val = '\b';
- break ;
- case 't' :
- val = '\t';
- break ;
- case 'f' :
- val = '\f';
- break ;
- case '\'' :
- val = '\'';
- break ;
- case '"' :
- val = '"';
- break ;
- case '\\' :
- val = '\\';
- break ;
- default :
- error( "invalid escape" );
- }
- }
- else
- if ( s[ 2 ] <= '7' && s[ 2 ] >= '0' )
- {
- /* \nnn sequence */
- if ( s[ 3 ] < '0' ||
- s[ 3 ] > '7' ||
- s[ 4 ] < '0' ||
- s[ 4 ] > '7' ||
- s[ 5 ] != '\0' )
- error( "illegal \\nnn construction" );
- val = 64 * s[ 2 ] + 8 * s[ 3 ] + s[ 4 ] - 73 * '0';
- if ( val == 0 )
- error( "'\\000' is illegal" );
- }
- }
- else
- {
- val = extval++;
- }
- tokset[ ntokens ].value = val;
- toklev[ ntokens ] = 0;
- # ifdef debug
- fprintf( ftable, "ret = %d\n", ntokens );
- # endif
- return ( ntokens );
- }
-