xref: /freebsd/contrib/flex/src/yylex.c (revision 61e21613)
1 /* yylex - scanner front-end for flex */
2 
3 /*  Copyright (c) 1990 The Regents of the University of California. */
4 /*  All rights reserved. */
5 
6 /*  This code is derived from software contributed to Berkeley by */
7 /*  Vern Paxson. */
8 
9 /*  The United States Government has rights in this work pursuant */
10 /*  to contract no. DE-AC03-76SF00098 between the United States */
11 /*  Department of Energy and the University of California. */
12 
13 /*  This file is part of flex. */
14 
15 /*  Redistribution and use in source and binary forms, with or without */
16 /*  modification, are permitted provided that the following conditions */
17 /*  are met: */
18 
19 /*  1. Redistributions of source code must retain the above copyright */
20 /*     notice, this list of conditions and the following disclaimer. */
21 /*  2. Redistributions in binary form must reproduce the above copyright */
22 /*     notice, this list of conditions and the following disclaimer in the */
23 /*     documentation and/or other materials provided with the distribution. */
24 
25 /*  Neither the name of the University nor the names of its contributors */
26 /*  may be used to endorse or promote products derived from this software */
27 /*  without specific prior written permission. */
28 
29 /*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
30 /*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
31 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
32 /*  PURPOSE. */
33 
34 #include <ctype.h>
35 #include "flexdef.h"
36 #include "parse.h"
37 
38 
39 /* yylex - scan for a regular expression token */
40 extern char *yytext;
41 extern FILE *yyout;
42 extern int yylval;
43 bool no_section3_escape = false;
44 int     yylex (void)
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 					if(trace_hex)
157 						fprintf (stderr, "\\x%02x", (unsigned int) yylval);
158 					else
159 						fprintf (stderr, "\\%.3o", (unsigned int) yylval);
160 				} else
161 					(void) putc (yylval, stderr);
162 				break;
163 			}
164 
165 			break;
166 
167 		case NUMBER:
168 			fprintf (stderr, "%d", yylval);
169 			break;
170 
171 		case PREVCCL:
172 			fprintf (stderr, "[%d]", yylval);
173 			break;
174 
175 		case EOF_OP:
176 			fprintf (stderr, "<<EOF>>");
177 			break;
178 
179 		case TOK_OPTION:
180 			fprintf (stderr, "%s ", yytext);
181 			break;
182 
183 		case TOK_OUTFILE:
184 		case TOK_PREFIX:
185 		case CCE_ALNUM:
186 		case CCE_ALPHA:
187 		case CCE_BLANK:
188 		case CCE_CNTRL:
189 		case CCE_DIGIT:
190 		case CCE_GRAPH:
191 		case CCE_LOWER:
192 		case CCE_PRINT:
193 		case CCE_PUNCT:
194 		case CCE_SPACE:
195 		case CCE_UPPER:
196 		case CCE_XDIGIT:
197 			fprintf (stderr, "%s", yytext);
198 			break;
199 
200 		case 0:
201 			fprintf (stderr, _("End Marker\n"));
202 			break;
203 
204 		default:
205 			fprintf (stderr,
206 				 _
207 				 ("*Something Weird* - tok: %d val: %d\n"),
208 				 toktype, yylval);
209 			break;
210 		}
211 	}
212 
213 	return toktype;
214 }
215