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: }

Defined functions

copy_c_code defined in line 116; used 1 times
  • in line 43
if_c_code defined in line 153; used 1 times
  • in line 59
yylex defined in line 7; used 1 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1043
Valid CSS Valid XHTML 1.0 Strict