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 are permitted provided
15 * that: (1) source distributions retain this entire copyright notice and
16 * comment, and (2) distributions including binaries display the following
17 * acknowledgement:  ``This product includes software developed by the
18 * University of California, Berkeley and its contributors'' in the
19 * documentation or other materials provided with the distribution and in
20 * all advertising materials mentioning features or use of this software.
21 * Neither the name of the University nor the names of its contributors may
22 * be used to endorse or promote products derived from this software without
23 * 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#include <sys/cdefs.h>
31__FBSDID("$FreeBSD$");
32
33#include <ctype.h>
34#include "flexdef.h"
35#include "parse.h"
36
37
38/* yylex - scan for a regular expression token */
39
40int yylex()
41	{
42	int toktype;
43	static int beglin = false;
44	extern char *yytext;
45
46	if ( eofseen )
47		toktype = EOF;
48	else
49		toktype = flexscan();
50
51	if ( toktype == EOF || toktype == 0 )
52		{
53		eofseen = 1;
54
55		if ( sectnum == 1 )
56			{
57			synerr( _( "premature EOF" ) );
58			sectnum = 2;
59			toktype = SECTEND;
60			}
61
62		else
63			toktype = 0;
64		}
65
66	if ( trace )
67		{
68		if ( beglin )
69			{
70			fprintf( stderr, "%d\t", num_rules + 1 );
71			beglin = 0;
72			}
73
74		switch ( toktype )
75			{
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			case '+':
95			case ',':
96				(void) putc( toktype, stderr );
97				break;
98
99			case '\n':
100				(void) putc( '\n', stderr );
101
102				if ( sectnum == 2 )
103				beglin = 1;
104
105				break;
106
107			case SCDECL:
108				fputs( "%s", stderr );
109				break;
110
111			case XSCDECL:
112				fputs( "%x", stderr );
113				break;
114
115			case SECTEND:
116				fputs( "%%\n", stderr );
117
118				/* We set beglin to be true so we'll start
119				 * writing out numbers as we echo rules.
120				 * flexscan() has already assigned sectnum.
121				 */
122				if ( sectnum == 2 )
123					beglin = 1;
124
125				break;
126
127			case NAME:
128				fprintf( stderr, "'%s'", nmstr );
129				break;
130
131			case CHAR:
132				switch ( yylval )
133					{
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					case '+':
153					case ',':
154						fprintf( stderr, "\\%c",
155							yylval );
156						break;
157
158					default:
159						if ( ! isascii( yylval ) ||
160						     ! isprint( yylval ) )
161							fprintf( stderr,
162								"\\%.3o",
163							(unsigned int) yylval );
164						else
165							(void) putc( yylval,
166								stderr );
167					break;
168					}
169
170				break;
171
172			case NUMBER:
173				fprintf( stderr, "%d", yylval );
174				break;
175
176			case PREVCCL:
177				fprintf( stderr, "[%d]", yylval );
178				break;
179
180			case EOF_OP:
181				fprintf( stderr, "<<EOF>>" );
182				break;
183
184			case OPTION_OP:
185				fprintf( stderr, "%s ", yytext );
186				break;
187
188			case OPT_OUTFILE:
189			case OPT_PREFIX:
190			case CCE_ALNUM:
191			case CCE_ALPHA:
192			case CCE_BLANK:
193			case CCE_CNTRL:
194			case CCE_DIGIT:
195			case CCE_GRAPH:
196			case CCE_LOWER:
197			case CCE_PRINT:
198			case CCE_PUNCT:
199			case CCE_SPACE:
200			case CCE_UPPER:
201			case CCE_XDIGIT:
202				fprintf( stderr, "%s", yytext );
203				break;
204
205			case 0:
206				fprintf( stderr, _( "End Marker\n" ) );
207				break;
208
209			default:
210				fprintf( stderr,
211				_( "*Something Weird* - tok: %d val: %d\n" ),
212					toktype, yylval );
213				break;
214			}
215		}
216
217	return toktype;
218	}
219