home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / equel / yylex.c < prev   
Encoding:
C/C++ Source or Header  |  1984-12-31  |  2.6 KB  |  179 lines

  1. # include    <stdio.h>
  2. # include    "constants.h"
  3. # include    "globals.h"
  4. # include    "y.tab.h"
  5. # include    <sccs.h>
  6.  
  7. SCCSID(@(#)yylex.c    8.1    12/31/84)
  8.  
  9.  
  10. /*
  11. **  YYLEX -- Lexical analyzer
  12. **    Yylex controls the return to the parser of lexemes,
  13. **    and the copying out of C_CODE on the all to yylex 
  14. **    after yylex() returned the C_CODE.
  15. **
  16. **    Returns:
  17. **        Lexical tokens.
  18. **
  19. **    Side Effects:
  20. **        Copies C code out on call after seeing it.
  21. **        Puts terminals in symbol space.
  22. **
  23. **    Called By:
  24. **        Yacc internals (yyparse()).
  25. */
  26.  
  27.  
  28.  
  29. yylex()
  30. {
  31.     register int        rtval;
  32.     register char        chr;
  33.  
  34.  
  35.  
  36.     /* get next token */
  37.     rtval = CONTINUE;
  38.  
  39.     while (rtval == CONTINUE)
  40.     {
  41.         if (C_code_flg)
  42.         {
  43.             copy_c_code();
  44.             Newline = 1;
  45.         }
  46.         Pre_proc_flg = 0;
  47.     
  48.         /* END OF FILE ? */
  49.         if ((chr = getch()) == EOF_TOK)
  50.         {
  51. #            ifdef xDEBUG
  52.             if (Lex_debug)
  53.                 printf("end of file\n");
  54. #            endif
  55.             return (0);
  56.         }
  57.     
  58.         /* Test for a line of C code */
  59.         if (Newline && if_c_code(chr))
  60.         {
  61.             if (C_code_flg)
  62.                 continue;
  63.             rtval = Tokens.sp_c_code;
  64.             C_code_flg = 1;
  65.             break;
  66.         }
  67.         else
  68.         {
  69.             C_code_flg = 0;
  70.             if (Newline)
  71.             {
  72.                 Newline = 0;
  73.                 continue;
  74.             }
  75.         }
  76.     
  77.         /* CARRIAGE CONTROL ? */
  78.         Newline = chr == '\n';
  79.  
  80.         switch (Cmap [chr])
  81.         {
  82.  
  83.           case PUNCT :
  84.             continue;
  85.  
  86.           case OPATR :
  87.             rtval = operator(chr);
  88.             break;
  89.  
  90.           case NUMBR :
  91.             rtval = number(chr);
  92.             break;
  93.  
  94.           case ALPHA :
  95.             rtval = name(chr);
  96.             break;
  97.  
  98.         }
  99.     }
  100.     if (Lex_debug)
  101.         printf("YYLEX : '%s'\n", 
  102.         yylval.u_dn ? yylval.u_dn->d_elm : "");
  103.     return (rtval);
  104. }
  105. /*
  106. **  COPY_C_CODE -- Copies out a line of C code
  107. **    The test for Charcnt != 0 is beacuse if a C pre-processor
  108. **    line follows an equel line, and equate_lines() puts out no
  109. **    newline, the initial '#' will not be on the beginning of 
  110. **    the line. As is, if this should happen, then the line
  111. **    with the '#' will be one line in the output ahead of 
  112. **    where it should be.
  113. */
  114.  
  115.  
  116. copy_c_code()
  117. {
  118.     char    ch [2];
  119.  
  120.  
  121.     ch [1] = 0;
  122.     equate_lines();
  123.     if (Pre_proc_flg)
  124.     {
  125.         if (Charcnt != 0)
  126.             w_raw("\n");
  127.         w_raw("#");
  128.     }
  129.     do
  130.     {
  131.         if ((*ch = getch()) == EOF_TOK)
  132.             return;
  133.         w_raw(ch);
  134.     } while (*ch != '\n');
  135. }
  136. /*
  137. **  IF_C_CODE -- Test to see if a line is C code
  138. **
  139. **    Sees if a line begins with "##" to see if it is equel.
  140. **
  141. **    Parameters:
  142. **        chr -- first char of line
  143. **
  144. **    Returns:
  145. **        0 -- Quel line
  146. **        1 -- C line
  147. **    
  148. **    Called By:
  149. **        yylex()
  150. */
  151.  
  152.  
  153. if_c_code(chr)
  154. char    chr;
  155. {
  156.     for ( ; ; )
  157.     {
  158.         if (chr != '#')
  159.         {
  160.             backup(chr);
  161.             return (1);
  162.         }
  163.         Pre_proc_flg = 1;
  164.         if ((chr = getch()) == EOF_TOK)
  165.         {
  166.             return (0);
  167.         }
  168.         if (chr != '#')
  169.         {
  170.             backup(chr);
  171.             return (1);
  172.         }
  173.         else
  174.         {
  175.             return (0);
  176.         }
  177.     }
  178. }
  179.