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