home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / yaccsrc2 / ydefin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-19  |  2.6 KB  |  100 lines

  1.  
  2. # include "y2.h" 
  3.  
  4. defin( t, s )
  5. register char * s;
  6.  
  7. {
  8.   /*   define s to be a terminal if t=0
  9.        or a nonterminal if t=1         */
  10.  
  11.   register val;
  12.  
  13.   # ifdef debug
  14.   fprintf( ftable, "defin t = %d s = %s ", t, s );
  15.   # endif 
  16.  
  17.   if ( t )
  18.     {
  19.       if ( ++nnonter >= NNONTERM )
  20.         error( "too many nonterminals, limit %d", NNONTERM );
  21.       nontrst[ nnonter ].name = cstash( s );
  22.       # ifdef debug
  23.       fprintf( ftable, "ret = %d\n", NTBASE + nnonter );
  24.       # endif 
  25.       return ( NTBASE + nnonter );
  26.     }
  27.     /* must be a token */
  28.   if ( ++ntokens >= NTERMS )
  29.     error( "too many terminals, limit %d", NTERMS );
  30.   tokset[ ntokens ].name  = cstash( s );
  31.  
  32.   /* establish value for token */
  33.  
  34.   if ( s[ 0 ] == ' ' && s[ 2 ] == '\0' ) /* single character literal */
  35.     val = s[ 1 ];
  36.   else
  37.     if ( s[ 0 ] == ' ' && s[ 1 ] == '\\' )
  38.       {
  39.         /* escape sequence */
  40.         if ( s[ 3 ] == '\0' )
  41.           {
  42.             /* single character escape sequence */
  43.             switch ( s[ 2 ] )
  44.               {
  45.                   /* character which is escaped */
  46.                 case 'n' :
  47.                   val = '\n';
  48.                   break ;
  49.                 case 'r' :
  50.                   val = '\r';
  51.                   break ;
  52.                 case 'b' :
  53.                   val = '\b';
  54.                   break ;
  55.                 case 't' :
  56.                   val = '\t';
  57.                   break ;
  58.                 case 'f' :
  59.                   val = '\f';
  60.                   break ;
  61.                 case '\'' :
  62.                   val = '\'';
  63.                   break ;
  64.                 case '"' :
  65.                   val = '"';
  66.                   break ;
  67.                 case '\\' :
  68.                   val = '\\';
  69.                   break ;
  70.                 default :
  71.                   error( "invalid escape" );
  72.               }
  73.           }
  74.         else
  75.           if ( s[ 2 ] <= '7' && s[ 2 ] >= '0' )
  76.             {
  77.               /* \nnn sequence */
  78.               if ( s[ 3 ] < '0' ||
  79.                    s[ 3 ] > '7' ||
  80.                    s[ 4 ] < '0' ||
  81.                    s[ 4 ] > '7' ||
  82.                    s[ 5 ] != '\0' )
  83.                 error( "illegal \\nnn construction" );
  84.               val = 64 * s[ 2 ] + 8 * s[ 3 ] + s[ 4 ] - 73 * '0';
  85.               if ( val == 0 )
  86.                 error( "'\\000' is illegal" );
  87.             }
  88.       }
  89.     else
  90.       {
  91.         val = extval++;
  92.       }
  93.   tokset[ ntokens ].value = val;
  94.   toklev[ ntokens ]       = 0;
  95.   # ifdef debug
  96.   fprintf( ftable, "ret = %d\n", ntokens );
  97.   # endif 
  98.   return ( ntokens );
  99. }
  100.