1/*	$NetBSD: yylex.c,v 1.2 2009/10/26 04:27:15 christos Exp $	*/
2
3/* yylex - scanner front-end for flex */
4
5/*  Copyright (c) 1990 The Regents of the University of California. */
6/*  All rights reserved. */
7
8/*  This code is derived from software contributed to Berkeley by */
9/*  Vern Paxson. */
10
11/*  The United States Government has rights in this work pursuant */
12/*  to contract no. DE-AC03-76SF00098 between the United States */
13/*  Department of Energy and the University of California. */
14
15/*  This file is part of flex. */
16
17/*  Redistribution and use in source and binary forms, with or without */
18/*  modification, are permitted provided that the following conditions */
19/*  are met: */
20
21/*  1. Redistributions of source code must retain the above copyright */
22/*     notice, this list of conditions and the following disclaimer. */
23/*  2. Redistributions in binary form must reproduce the above copyright */
24/*     notice, this list of conditions and the following disclaimer in the */
25/*     documentation and/or other materials provided with the distribution. */
26
27/*  Neither the name of the University nor the names of its contributors */
28/*  may be used to endorse or promote products derived from this software */
29/*  without specific prior written permission. */
30
31/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
32/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
33/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
34/*  PURPOSE. */
35
36#include <ctype.h>
37#include "flexdef.h"
38#include "parse.h"
39
40
41/* yylex - scan for a regular expression token */
42
43extern char *yytext;
44int     yylex ()
45{
46	int     toktype;
47	static int beglin = false;
48
49	if (eofseen)
50		toktype = EOF;
51	else
52		toktype = flexscan ();
53
54	if (toktype == EOF || toktype == 0) {
55		eofseen = 1;
56
57		if (sectnum == 1) {
58			synerr (_("premature EOF"));
59			sectnum = 2;
60			toktype = SECTEND;
61		}
62
63		else
64			toktype = 0;
65	}
66
67	if (trace) {
68		if (beglin) {
69			fprintf (stderr, "%d\t", num_rules + 1);
70			beglin = 0;
71		}
72
73		switch (toktype) {
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			case '<':
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				fprintf (stderr, "\\%c", yylval);
152				break;
153
154			default:
155				if (!isascii (yylval) || !isprint (yylval))
156					fprintf (stderr,
157						 "\\%.3o",
158						 (unsigned int) yylval);
159				else
160					(void) putc (yylval, stderr);
161				break;
162			}
163
164			break;
165
166		case NUMBER:
167			fprintf (stderr, "%d", yylval);
168			break;
169
170		case PREVCCL:
171			fprintf (stderr, "[%d]", yylval);
172			break;
173
174		case EOF_OP:
175			fprintf (stderr, "<<EOF>>");
176			break;
177
178		case OPTION_OP:
179			fprintf (stderr, "%s ", yytext);
180			break;
181
182		case OPT_OUTFILE:
183		case OPT_PREFIX:
184		case CCE_ALNUM:
185		case CCE_ALPHA:
186		case CCE_BLANK:
187		case CCE_CNTRL:
188		case CCE_DIGIT:
189		case CCE_GRAPH:
190		case CCE_LOWER:
191		case CCE_PRINT:
192		case CCE_PUNCT:
193		case CCE_SPACE:
194		case CCE_UPPER:
195		case CCE_XDIGIT:
196			fprintf (stderr, "%s", yytext);
197			break;
198
199		case 0:
200			fprintf (stderr, _("End Marker\n"));
201			break;
202
203		default:
204			fprintf (stderr,
205				 _
206				 ("*Something Weird* - tok: %d val: %d\n"),
207				 toktype, yylval);
208			break;
209		}
210	}
211
212	return toktype;
213}
214