OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / lib / flex / yylex.c
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
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         }