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