home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / OS2-YACC.ZIP / YDEFIN.2C < prev    next >
Text File  |  1989-09-29  |  3KB  |  99 lines

  1. /*
  2.   HEADER: CUG     nnn.nn;
  3.   TITLE:     YACC - Yet Another Compilier-Compilier
  4.   VERSION:     1.0 for IBM-PC
  5.   DATE:      JAN 28, 1985
  6.   DESCRIPTION:     LALR(1) Parser Generator. From UNIX
  7.   KEYWORDS:     Parser Generator Compilier-Compilier YACC
  8.   SYSTEM:     IBM-PC and Compatiables
  9.   FILENAME:      YDEFIN.2C
  10.   WARNINGS:     This program is not for the casual user. It will
  11.          be useful primarily to expert developers.
  12.   CRC:         N/A
  13.   SEE-ALSO:     LEX and PREP
  14.   AUTHORS:     Scott Guthery 11100 leafwood lane Austin, TX 78750
  15.   COMPILERS:     DESMET-C
  16.   REFERENCES:     UNIX Systems Manuals
  17. */
  18.  
  19. #include "y1.h"
  20. #include "y2.h"
  21.  
  22. int defin( int t, register char *s )
  23.  
  24.    {
  25.    /*   define s to be a terminal if t=0
  26.         or a nonterminal if t=1         */
  27.  
  28.    register val;
  29.  
  30.    if (t) 
  31.       {
  32.       if( ++nnonter >= NNONTERM ) error("too many nonterminals, limit %d",NNONTERM);
  33.       nontrst[nnonter].name = cstash(s);
  34.       return( NTBASE + nnonter );
  35.       }
  36.    /* must be a token */
  37.    if( ++ntokens >= NTERMS ) error("too many terminals, limit %d",NTERMS );
  38.    tokset[ntokens].name = cstash(s);
  39.  
  40.    /* establish value for token */
  41.  
  42.    if( s[0]==' ' && s[2]=='\0' ) /* single character literal */
  43.       val = s[1];
  44.    else if ( s[0]==' ' && s[1]=='\\' ) 
  45.       {
  46.       /* escape sequence */
  47.       if( s[3] == '\0' )
  48.          {
  49.          /* single character escape sequence */
  50.          switch ( s[2] )
  51.             {
  52.             /* character which is escaped */
  53.          case 'n': 
  54.             val = '\n'; 
  55.             break;
  56.          case 'r': 
  57.             val = '\r'; 
  58.             break;
  59.          case 'b': 
  60.             val = '\b'; 
  61.             break;
  62.          case 't': 
  63.             val = '\t'; 
  64.             break;
  65.          case 'f': 
  66.             val = '\f'; 
  67.             break;
  68.          case '\'': 
  69.             val = '\''; 
  70.             break;
  71.          case '"': 
  72.             val = '"'; 
  73.             break;
  74.          case '\\': 
  75.             val = '\\'; 
  76.             break;
  77.          default: 
  78.             error( "invalid escape" );
  79.             }
  80.          }
  81.  
  82.       else if( s[2] <= '7' && s[2]>='0' )
  83.          {
  84.          /* \nnn sequence */
  85.          if( s[3]<'0' || s[3] > '7' || s[4]<'0' ||
  86.              s[4]>'7' || s[5] != '\0' ) error("illegal \\nnn construction" );
  87.          val = 64*s[2] + 8*s[3] + s[4] - 73*'0';
  88.          if( val == 0 ) error( "'\\000' is illegal" );
  89.          }
  90.       }
  91.    else 
  92.       {
  93.       val = extval++;
  94.       }
  95.    tokset[ntokens].value = val;
  96.    toklev[ntokens] = 0;
  97.    return( ntokens );
  98.    }
  99.