]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/flex/src/yylex.c
MFV: r362286
[FreeBSD/FreeBSD.git] / contrib / flex / src / yylex.c
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 }