Home | History | Annotate | Download | only in flex-2.5.4a
      1 /* yylex - scanner front-end for flex */
      2 
      3 /*-
      4  * Copyright (c) 1990 The Regents of the University of California.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * Vern Paxson.
      9  *
     10  * The United States Government has rights in this work pursuant
     11  * to contract no. DE-AC03-76SF00098 between the United States
     12  * Department of Energy and the University of California.
     13  *
     14  * Redistribution and use in source and binary forms with or without
     15  * modification are permitted provided that: (1) source distributions retain
     16  * this entire copyright notice and comment, and (2) distributions including
     17  * binaries display the following acknowledgement:  ``This product includes
     18  * software developed by the University of California, Berkeley and its
     19  * contributors'' in the documentation or other materials provided with the
     20  * distribution and in all advertising materials mentioning features or use
     21  * of this software.  Neither the name of the University nor the names of
     22  * its contributors may be used to endorse or promote products derived from
     23  * this software without specific prior written permission.
     24  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
     25  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
     26  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
     27  */
     28 
     29 /* $Header: /home/daffy/u0/vern/flex/RCS/yylex.c,v 2.13 95/03/04 16:10:41 vern Exp $ */
     30 
     31 #include <ctype.h>
     32 #include "flexdef.h"
     33 #include "parse.h"
     34 
     35 
     36 /* yylex - scan for a regular expression token */
     37 
     38 int yylex()
     39 	{
     40 	int toktype;
     41 	static int beglin = false;
     42 	extern char *yytext;
     43 
     44 	if ( eofseen )
     45 		toktype = EOF;
     46 	else
     47 		toktype = flexscan();
     48 
     49 	if ( toktype == EOF || toktype == 0 )
     50 		{
     51 		eofseen = 1;
     52 
     53 		if ( sectnum == 1 )
     54 			{
     55 			synerr( _( "premature EOF" ) );
     56 			sectnum = 2;
     57 			toktype = SECTEND;
     58 			}
     59 
     60 		else
     61 			toktype = 0;
     62 		}
     63 
     64 	if ( trace )
     65 		{
     66 		if ( beglin )
     67 			{
     68 			fprintf( stderr, "%d\t", num_rules + 1 );
     69 			beglin = 0;
     70 			}
     71 
     72 		switch ( toktype )
     73 			{
     74 			case '<':
     75 			case '>':
     76 			case '^':
     77 			case '$':
     78 			case '"':
     79 			case '[':
     80 			case ']':
     81 			case '{':
     82 			case '}':
     83 			case '|':
     84 			case '(':
     85 			case ')':
     86 			case '-':
     87 			case '/':
     88 			case '\\':
     89 			case '?':
     90 			case '.':
     91 			case '*':
     92 			case '+':
     93 			case ',':
     94 				(void) putc( toktype, stderr );
     95 				break;
     96 
     97 			case '\n':
     98 				(void) putc( '\n', stderr );
     99 
    100 				if ( sectnum == 2 )
    101 				beglin = 1;
    102 
    103 				break;
    104 
    105 			case SCDECL:
    106 				fputs( "%s", stderr );
    107 				break;
    108 
    109 			case XSCDECL:
    110 				fputs( "%x", stderr );
    111 				break;
    112 
    113 			case SECTEND:
    114 				fputs( "%%\n", stderr );
    115 
    116 				/* We set beglin to be true so we'll start
    117 				 * writing out numbers as we echo rules.
    118 				 * flexscan() has already assigned sectnum.
    119 				 */
    120 				if ( sectnum == 2 )
    121 					beglin = 1;
    122 
    123 				break;
    124 
    125 			case NAME:
    126 				fprintf( stderr, "'%s'", nmstr );
    127 				break;
    128 
    129 			case CHAR:
    130 				switch ( yylval )
    131 					{
    132 					case '<':
    133 					case '>':
    134 					case '^':
    135 					case '$':
    136 					case '"':
    137 					case '[':
    138 					case ']':
    139 					case '{':
    140 					case '}':
    141 					case '|':
    142 					case '(':
    143 					case ')':
    144 					case '-':
    145 					case '/':
    146 					case '\\':
    147 					case '?':
    148 					case '.':
    149 					case '*':
    150 					case '+':
    151 					case ',':
    152 						fprintf( stderr, "\\%c",
    153 							yylval );
    154 						break;
    155 
    156 					default:
    157 						if ( ! isascii( yylval ) ||
    158 						     ! isprint( yylval ) )
    159 							fprintf( stderr,
    160 								"\\%.3o",
    161 							(unsigned int) yylval );
    162 						else
    163 							(void) putc( yylval,
    164 								stderr );
    165 					break;
    166 					}
    167 
    168 				break;
    169 
    170 			case NUMBER:
    171 				fprintf( stderr, "%d", yylval );
    172 				break;
    173 
    174 			case PREVCCL:
    175 				fprintf( stderr, "[%d]", yylval );
    176 				break;
    177 
    178 			case EOF_OP:
    179 				fprintf( stderr, "<<EOF>>" );
    180 				break;
    181 
    182 			case OPTION_OP:
    183 				fprintf( stderr, "%s ", yytext );
    184 				break;
    185 
    186 			case OPT_OUTFILE:
    187 			case OPT_PREFIX:
    188 			case CCE_ALNUM:
    189 			case CCE_ALPHA:
    190 			case CCE_BLANK:
    191 			case CCE_CNTRL:
    192 			case CCE_DIGIT:
    193 			case CCE_GRAPH:
    194 			case CCE_LOWER:
    195 			case CCE_PRINT:
    196 			case CCE_PUNCT:
    197 			case CCE_SPACE:
    198 			case CCE_UPPER:
    199 			case CCE_XDIGIT:
    200 				fprintf( stderr, "%s", yytext );
    201 				break;
    202 
    203 			case 0:
    204 				fprintf( stderr, _( "End Marker\n" ) );
    205 				break;
    206 
    207 			default:
    208 				fprintf( stderr,
    209 				_( "*Something Weird* - tok: %d val: %d\n" ),
    210 					toktype, yylval );
    211 				break;
    212 			}
    213 		}
    214 
    215 	return toktype;
    216 	}
    217