• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
yylex()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