xref: /utopia/UTPA2-700.0.x/projects/build/scripts/genksyms/lex.l (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /* Lexical analysis for genksyms.
2*53ee8cc1Swenshuai.xi    Copyright 1996, 1997 Linux International.
3*53ee8cc1Swenshuai.xi 
4*53ee8cc1Swenshuai.xi    New implementation contributed by Richard Henderson <rth@tamu.edu>
5*53ee8cc1Swenshuai.xi    Based on original work by Bjorn Ekwall <bj0rn@blox.se>
6*53ee8cc1Swenshuai.xi 
7*53ee8cc1Swenshuai.xi    Taken from Linux modutils 2.4.22.
8*53ee8cc1Swenshuai.xi 
9*53ee8cc1Swenshuai.xi    This program is free software; you can redistribute it and/or modify it
10*53ee8cc1Swenshuai.xi    under the terms of the GNU General Public License as published by the
11*53ee8cc1Swenshuai.xi    Free Software Foundation; either version 2 of the License, or (at your
12*53ee8cc1Swenshuai.xi    option) any later version.
13*53ee8cc1Swenshuai.xi 
14*53ee8cc1Swenshuai.xi    This program is distributed in the hope that it will be useful, but
15*53ee8cc1Swenshuai.xi    WITHOUT ANY WARRANTY; without even the implied warranty of
16*53ee8cc1Swenshuai.xi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17*53ee8cc1Swenshuai.xi    General Public License for more details.
18*53ee8cc1Swenshuai.xi 
19*53ee8cc1Swenshuai.xi    You should have received a copy of the GNU General Public License
20*53ee8cc1Swenshuai.xi    along with this program; if not, write to the Free Software Foundation,
21*53ee8cc1Swenshuai.xi    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22*53ee8cc1Swenshuai.xi 
23*53ee8cc1Swenshuai.xi 
24*53ee8cc1Swenshuai.xi %{
25*53ee8cc1Swenshuai.xi 
26*53ee8cc1Swenshuai.xi #include <limits.h>
27*53ee8cc1Swenshuai.xi #include <stdlib.h>
28*53ee8cc1Swenshuai.xi #include <string.h>
29*53ee8cc1Swenshuai.xi #include <ctype.h>
30*53ee8cc1Swenshuai.xi 
31*53ee8cc1Swenshuai.xi #include "genksyms.h"
32*53ee8cc1Swenshuai.xi #include "parse.h"
33*53ee8cc1Swenshuai.xi 
34*53ee8cc1Swenshuai.xi /* We've got a two-level lexer here.  We let flex do basic tokenization
35*53ee8cc1Swenshuai.xi    and then we categorize those basic tokens in the second stage.  */
36*53ee8cc1Swenshuai.xi #define YY_DECL		static int yylex1(void)
37*53ee8cc1Swenshuai.xi 
38*53ee8cc1Swenshuai.xi %}
39*53ee8cc1Swenshuai.xi 
40*53ee8cc1Swenshuai.xi IDENT			[A-Za-z_\$][A-Za-z0-9_\$]*
41*53ee8cc1Swenshuai.xi 
42*53ee8cc1Swenshuai.xi O_INT			0[0-7]*
43*53ee8cc1Swenshuai.xi D_INT			[1-9][0-9]*
44*53ee8cc1Swenshuai.xi X_INT			0[Xx][0-9A-Fa-f]+
45*53ee8cc1Swenshuai.xi I_SUF			[Uu]|[Ll]|[Uu][Ll]|[Ll][Uu]
46*53ee8cc1Swenshuai.xi INT			({O_INT}|{D_INT}|{X_INT}){I_SUF}?
47*53ee8cc1Swenshuai.xi 
48*53ee8cc1Swenshuai.xi FRAC			([0-9]*\.[0-9]+)|([0-9]+\.)
49*53ee8cc1Swenshuai.xi EXP			[Ee][+-]?[0-9]+
50*53ee8cc1Swenshuai.xi F_SUF			[FfLl]
51*53ee8cc1Swenshuai.xi REAL			({FRAC}{EXP}?{F_SUF}?)|([0-9]+{EXP}{F_SUF}?)
52*53ee8cc1Swenshuai.xi 
53*53ee8cc1Swenshuai.xi STRING			L?\"([^\\\"]*\\.)*[^\\\"]*\"
54*53ee8cc1Swenshuai.xi CHAR			L?\'([^\\\']*\\.)*[^\\\']*\'
55*53ee8cc1Swenshuai.xi 
56*53ee8cc1Swenshuai.xi MC_TOKEN		([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
57*53ee8cc1Swenshuai.xi 
58*53ee8cc1Swenshuai.xi /* We don't do multiple input files.  */
59*53ee8cc1Swenshuai.xi %option noyywrap
60*53ee8cc1Swenshuai.xi 
61*53ee8cc1Swenshuai.xi %option noinput
62*53ee8cc1Swenshuai.xi 
63*53ee8cc1Swenshuai.xi %%
64*53ee8cc1Swenshuai.xi 
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi  /* Keep track of our location in the original source files.  */
67*53ee8cc1Swenshuai.xi ^#[ \t]+{INT}[ \t]+\"[^\"\n]+\".*\n	return FILENAME;
68*53ee8cc1Swenshuai.xi ^#.*\n					cur_line++;
69*53ee8cc1Swenshuai.xi \n					cur_line++;
70*53ee8cc1Swenshuai.xi 
71*53ee8cc1Swenshuai.xi  /* Ignore all other whitespace.  */
72*53ee8cc1Swenshuai.xi [ \t\f\v\r]+				;
73*53ee8cc1Swenshuai.xi 
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi {STRING}				return STRING;
76*53ee8cc1Swenshuai.xi {CHAR}					return CHAR;
77*53ee8cc1Swenshuai.xi {IDENT}					return IDENT;
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi  /* The Pedant requires that the other C multi-character tokens be
80*53ee8cc1Swenshuai.xi     recognized as tokens.  We don't actually use them since we don't
81*53ee8cc1Swenshuai.xi     parse expressions, but we do want whitespace to be arranged
82*53ee8cc1Swenshuai.xi     around them properly.  */
83*53ee8cc1Swenshuai.xi {MC_TOKEN}				return OTHER;
84*53ee8cc1Swenshuai.xi {INT}					return INT;
85*53ee8cc1Swenshuai.xi {REAL}					return REAL;
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi "..."					return DOTS;
88*53ee8cc1Swenshuai.xi 
89*53ee8cc1Swenshuai.xi  /* All other tokens are single characters.  */
90*53ee8cc1Swenshuai.xi .					return yytext[0];
91*53ee8cc1Swenshuai.xi 
92*53ee8cc1Swenshuai.xi 
93*53ee8cc1Swenshuai.xi %%
94*53ee8cc1Swenshuai.xi 
95*53ee8cc1Swenshuai.xi /* Bring in the keyword recognizer.  */
96*53ee8cc1Swenshuai.xi 
97*53ee8cc1Swenshuai.xi #include "keywords.c"
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi 
100*53ee8cc1Swenshuai.xi /* Macros to append to our phrase collection list.  */
101*53ee8cc1Swenshuai.xi 
102*53ee8cc1Swenshuai.xi /*
103*53ee8cc1Swenshuai.xi  * We mark any token, that that equals to a known enumerator, as
104*53ee8cc1Swenshuai.xi  * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
105*53ee8cc1Swenshuai.xi  * the only problem is struct and union members:
106*53ee8cc1Swenshuai.xi  *    enum e { a, b }; struct s { int a, b; }
107*53ee8cc1Swenshuai.xi  * but in this case, the only effect will be, that the ABI checksums become
108*53ee8cc1Swenshuai.xi  * more volatile, which is acceptable. Also, such collisions are quite rare,
109*53ee8cc1Swenshuai.xi  * so far it was only observed in include/linux/telephony.h.
110*53ee8cc1Swenshuai.xi  */
111*53ee8cc1Swenshuai.xi #define _APP(T,L)	do {						   \
112*53ee8cc1Swenshuai.xi 			  cur_node = next_node;				   \
113*53ee8cc1Swenshuai.xi 			  next_node = xmalloc(sizeof(*next_node));	   \
114*53ee8cc1Swenshuai.xi 			  next_node->next = cur_node;			   \
115*53ee8cc1Swenshuai.xi 			  cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
116*53ee8cc1Swenshuai.xi 			  cur_node->tag =				   \
117*53ee8cc1Swenshuai.xi 			    find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
118*53ee8cc1Swenshuai.xi 			    SYM_ENUM_CONST : SYM_NORMAL ;		   \
119*53ee8cc1Swenshuai.xi 			} while (0)
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi #define APP		_APP(yytext, yyleng)
122*53ee8cc1Swenshuai.xi 
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi /* The second stage lexer.  Here we incorporate knowledge of the state
125*53ee8cc1Swenshuai.xi    of the parser to tailor the tokens that are returned.  */
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi int
128*53ee8cc1Swenshuai.xi yylex(void)
129*53ee8cc1Swenshuai.xi {
130*53ee8cc1Swenshuai.xi   static enum {
131*53ee8cc1Swenshuai.xi     ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_BRACKET, ST_BRACE,
132*53ee8cc1Swenshuai.xi     ST_EXPRESSION, ST_TABLE_1, ST_TABLE_2, ST_TABLE_3, ST_TABLE_4,
133*53ee8cc1Swenshuai.xi     ST_TABLE_5, ST_TABLE_6
134*53ee8cc1Swenshuai.xi   } lexstate = ST_NOTSTARTED;
135*53ee8cc1Swenshuai.xi 
136*53ee8cc1Swenshuai.xi   static int suppress_type_lookup, dont_want_brace_phrase;
137*53ee8cc1Swenshuai.xi   static struct string_list *next_node;
138*53ee8cc1Swenshuai.xi 
139*53ee8cc1Swenshuai.xi   int token, count = 0;
140*53ee8cc1Swenshuai.xi   struct string_list *cur_node;
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi   if (lexstate == ST_NOTSTARTED)
143*53ee8cc1Swenshuai.xi     {
144*53ee8cc1Swenshuai.xi       next_node = xmalloc(sizeof(*next_node));
145*53ee8cc1Swenshuai.xi       next_node->next = NULL;
146*53ee8cc1Swenshuai.xi       lexstate = ST_NORMAL;
147*53ee8cc1Swenshuai.xi     }
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi repeat:
150*53ee8cc1Swenshuai.xi   token = yylex1();
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi   if (token == 0)
153*53ee8cc1Swenshuai.xi     return 0;
154*53ee8cc1Swenshuai.xi   else if (token == FILENAME)
155*53ee8cc1Swenshuai.xi     {
156*53ee8cc1Swenshuai.xi       char *file, *e;
157*53ee8cc1Swenshuai.xi 
158*53ee8cc1Swenshuai.xi       /* Save the filename and line number for later error messages.  */
159*53ee8cc1Swenshuai.xi 
160*53ee8cc1Swenshuai.xi       if (cur_filename)
161*53ee8cc1Swenshuai.xi 	free(cur_filename);
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi       file = strchr(yytext, '\"')+1;
164*53ee8cc1Swenshuai.xi       e = strchr(file, '\"');
165*53ee8cc1Swenshuai.xi       *e = '\0';
166*53ee8cc1Swenshuai.xi       cur_filename = memcpy(xmalloc(e-file+1), file, e-file+1);
167*53ee8cc1Swenshuai.xi       cur_line = atoi(yytext+2);
168*53ee8cc1Swenshuai.xi 
169*53ee8cc1Swenshuai.xi       goto repeat;
170*53ee8cc1Swenshuai.xi     }
171*53ee8cc1Swenshuai.xi 
172*53ee8cc1Swenshuai.xi   switch (lexstate)
173*53ee8cc1Swenshuai.xi     {
174*53ee8cc1Swenshuai.xi     case ST_NORMAL:
175*53ee8cc1Swenshuai.xi       switch (token)
176*53ee8cc1Swenshuai.xi 	{
177*53ee8cc1Swenshuai.xi 	case IDENT:
178*53ee8cc1Swenshuai.xi 	  APP;
179*53ee8cc1Swenshuai.xi 	  {
180*53ee8cc1Swenshuai.xi 	    const struct resword *r = is_reserved_word(yytext, yyleng);
181*53ee8cc1Swenshuai.xi 	    if (r)
182*53ee8cc1Swenshuai.xi 	      {
183*53ee8cc1Swenshuai.xi 		switch (token = r->token)
184*53ee8cc1Swenshuai.xi 		  {
185*53ee8cc1Swenshuai.xi 		  case ATTRIBUTE_KEYW:
186*53ee8cc1Swenshuai.xi 		    lexstate = ST_ATTRIBUTE;
187*53ee8cc1Swenshuai.xi 		    count = 0;
188*53ee8cc1Swenshuai.xi 		    goto repeat;
189*53ee8cc1Swenshuai.xi 		  case ASM_KEYW:
190*53ee8cc1Swenshuai.xi 		    lexstate = ST_ASM;
191*53ee8cc1Swenshuai.xi 		    count = 0;
192*53ee8cc1Swenshuai.xi 		    goto repeat;
193*53ee8cc1Swenshuai.xi 
194*53ee8cc1Swenshuai.xi 		  case STRUCT_KEYW:
195*53ee8cc1Swenshuai.xi 		  case UNION_KEYW:
196*53ee8cc1Swenshuai.xi 		  case ENUM_KEYW:
197*53ee8cc1Swenshuai.xi 		    dont_want_brace_phrase = 3;
198*53ee8cc1Swenshuai.xi 		    suppress_type_lookup = 2;
199*53ee8cc1Swenshuai.xi 		    goto fini;
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi 		  case EXPORT_SYMBOL_KEYW:
202*53ee8cc1Swenshuai.xi 		      goto fini;
203*53ee8cc1Swenshuai.xi 		  }
204*53ee8cc1Swenshuai.xi 	      }
205*53ee8cc1Swenshuai.xi 	    if (!suppress_type_lookup)
206*53ee8cc1Swenshuai.xi 	      {
207*53ee8cc1Swenshuai.xi 		if (find_symbol(yytext, SYM_TYPEDEF, 1))
208*53ee8cc1Swenshuai.xi 		  token = TYPE;
209*53ee8cc1Swenshuai.xi 	      }
210*53ee8cc1Swenshuai.xi 	  }
211*53ee8cc1Swenshuai.xi 	  break;
212*53ee8cc1Swenshuai.xi 
213*53ee8cc1Swenshuai.xi 	case '[':
214*53ee8cc1Swenshuai.xi 	  APP;
215*53ee8cc1Swenshuai.xi 	  lexstate = ST_BRACKET;
216*53ee8cc1Swenshuai.xi 	  count = 1;
217*53ee8cc1Swenshuai.xi 	  goto repeat;
218*53ee8cc1Swenshuai.xi 
219*53ee8cc1Swenshuai.xi 	case '{':
220*53ee8cc1Swenshuai.xi 	  APP;
221*53ee8cc1Swenshuai.xi 	  if (dont_want_brace_phrase)
222*53ee8cc1Swenshuai.xi 	    break;
223*53ee8cc1Swenshuai.xi 	  lexstate = ST_BRACE;
224*53ee8cc1Swenshuai.xi 	  count = 1;
225*53ee8cc1Swenshuai.xi 	  goto repeat;
226*53ee8cc1Swenshuai.xi 
227*53ee8cc1Swenshuai.xi 	case '=': case ':':
228*53ee8cc1Swenshuai.xi 	  APP;
229*53ee8cc1Swenshuai.xi 	  lexstate = ST_EXPRESSION;
230*53ee8cc1Swenshuai.xi 	  break;
231*53ee8cc1Swenshuai.xi 
232*53ee8cc1Swenshuai.xi 	case DOTS:
233*53ee8cc1Swenshuai.xi 	default:
234*53ee8cc1Swenshuai.xi 	  APP;
235*53ee8cc1Swenshuai.xi 	  break;
236*53ee8cc1Swenshuai.xi 	}
237*53ee8cc1Swenshuai.xi       break;
238*53ee8cc1Swenshuai.xi 
239*53ee8cc1Swenshuai.xi     case ST_ATTRIBUTE:
240*53ee8cc1Swenshuai.xi       APP;
241*53ee8cc1Swenshuai.xi       switch (token)
242*53ee8cc1Swenshuai.xi 	{
243*53ee8cc1Swenshuai.xi 	case '(':
244*53ee8cc1Swenshuai.xi 	  ++count;
245*53ee8cc1Swenshuai.xi 	  goto repeat;
246*53ee8cc1Swenshuai.xi 	case ')':
247*53ee8cc1Swenshuai.xi 	  if (--count == 0)
248*53ee8cc1Swenshuai.xi 	    {
249*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
250*53ee8cc1Swenshuai.xi 	      token = ATTRIBUTE_PHRASE;
251*53ee8cc1Swenshuai.xi 	      break;
252*53ee8cc1Swenshuai.xi 	    }
253*53ee8cc1Swenshuai.xi 	  goto repeat;
254*53ee8cc1Swenshuai.xi 	default:
255*53ee8cc1Swenshuai.xi 	  goto repeat;
256*53ee8cc1Swenshuai.xi 	}
257*53ee8cc1Swenshuai.xi       break;
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi     case ST_ASM:
260*53ee8cc1Swenshuai.xi       APP;
261*53ee8cc1Swenshuai.xi       switch (token)
262*53ee8cc1Swenshuai.xi 	{
263*53ee8cc1Swenshuai.xi 	case '(':
264*53ee8cc1Swenshuai.xi 	  ++count;
265*53ee8cc1Swenshuai.xi 	  goto repeat;
266*53ee8cc1Swenshuai.xi 	case ')':
267*53ee8cc1Swenshuai.xi 	  if (--count == 0)
268*53ee8cc1Swenshuai.xi 	    {
269*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
270*53ee8cc1Swenshuai.xi 	      token = ASM_PHRASE;
271*53ee8cc1Swenshuai.xi 	      break;
272*53ee8cc1Swenshuai.xi 	    }
273*53ee8cc1Swenshuai.xi 	  goto repeat;
274*53ee8cc1Swenshuai.xi 	default:
275*53ee8cc1Swenshuai.xi 	  goto repeat;
276*53ee8cc1Swenshuai.xi 	}
277*53ee8cc1Swenshuai.xi       break;
278*53ee8cc1Swenshuai.xi 
279*53ee8cc1Swenshuai.xi     case ST_BRACKET:
280*53ee8cc1Swenshuai.xi       APP;
281*53ee8cc1Swenshuai.xi       switch (token)
282*53ee8cc1Swenshuai.xi 	{
283*53ee8cc1Swenshuai.xi 	case '[':
284*53ee8cc1Swenshuai.xi 	  ++count;
285*53ee8cc1Swenshuai.xi 	  goto repeat;
286*53ee8cc1Swenshuai.xi 	case ']':
287*53ee8cc1Swenshuai.xi 	  if (--count == 0)
288*53ee8cc1Swenshuai.xi 	    {
289*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
290*53ee8cc1Swenshuai.xi 	      token = BRACKET_PHRASE;
291*53ee8cc1Swenshuai.xi 	      break;
292*53ee8cc1Swenshuai.xi 	    }
293*53ee8cc1Swenshuai.xi 	  goto repeat;
294*53ee8cc1Swenshuai.xi 	default:
295*53ee8cc1Swenshuai.xi 	  goto repeat;
296*53ee8cc1Swenshuai.xi 	}
297*53ee8cc1Swenshuai.xi       break;
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi     case ST_BRACE:
300*53ee8cc1Swenshuai.xi       APP;
301*53ee8cc1Swenshuai.xi       switch (token)
302*53ee8cc1Swenshuai.xi 	{
303*53ee8cc1Swenshuai.xi 	case '{':
304*53ee8cc1Swenshuai.xi 	  ++count;
305*53ee8cc1Swenshuai.xi 	  goto repeat;
306*53ee8cc1Swenshuai.xi 	case '}':
307*53ee8cc1Swenshuai.xi 	  if (--count == 0)
308*53ee8cc1Swenshuai.xi 	    {
309*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
310*53ee8cc1Swenshuai.xi 	      token = BRACE_PHRASE;
311*53ee8cc1Swenshuai.xi 	      break;
312*53ee8cc1Swenshuai.xi 	    }
313*53ee8cc1Swenshuai.xi 	  goto repeat;
314*53ee8cc1Swenshuai.xi 	default:
315*53ee8cc1Swenshuai.xi 	  goto repeat;
316*53ee8cc1Swenshuai.xi 	}
317*53ee8cc1Swenshuai.xi       break;
318*53ee8cc1Swenshuai.xi 
319*53ee8cc1Swenshuai.xi     case ST_EXPRESSION:
320*53ee8cc1Swenshuai.xi       switch (token)
321*53ee8cc1Swenshuai.xi 	{
322*53ee8cc1Swenshuai.xi 	case '(': case '[': case '{':
323*53ee8cc1Swenshuai.xi 	  ++count;
324*53ee8cc1Swenshuai.xi 	  APP;
325*53ee8cc1Swenshuai.xi 	  goto repeat;
326*53ee8cc1Swenshuai.xi 	case '}':
327*53ee8cc1Swenshuai.xi 	  /* is this the last line of an enum declaration? */
328*53ee8cc1Swenshuai.xi 	  if (count == 0)
329*53ee8cc1Swenshuai.xi 	    {
330*53ee8cc1Swenshuai.xi 	      /* Put back the token we just read so's we can find it again
331*53ee8cc1Swenshuai.xi 		 after registering the expression.  */
332*53ee8cc1Swenshuai.xi 	      unput(token);
333*53ee8cc1Swenshuai.xi 
334*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
335*53ee8cc1Swenshuai.xi 	      token = EXPRESSION_PHRASE;
336*53ee8cc1Swenshuai.xi 	      break;
337*53ee8cc1Swenshuai.xi 	    }
338*53ee8cc1Swenshuai.xi 	  /* FALLTHRU */
339*53ee8cc1Swenshuai.xi 	case ')': case ']':
340*53ee8cc1Swenshuai.xi 	  --count;
341*53ee8cc1Swenshuai.xi 	  APP;
342*53ee8cc1Swenshuai.xi 	  goto repeat;
343*53ee8cc1Swenshuai.xi 	case ',': case ';':
344*53ee8cc1Swenshuai.xi 	  if (count == 0)
345*53ee8cc1Swenshuai.xi 	    {
346*53ee8cc1Swenshuai.xi 	      /* Put back the token we just read so's we can find it again
347*53ee8cc1Swenshuai.xi 		 after registering the expression.  */
348*53ee8cc1Swenshuai.xi 	      unput(token);
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi 	      lexstate = ST_NORMAL;
351*53ee8cc1Swenshuai.xi 	      token = EXPRESSION_PHRASE;
352*53ee8cc1Swenshuai.xi 	      break;
353*53ee8cc1Swenshuai.xi 	    }
354*53ee8cc1Swenshuai.xi 	  APP;
355*53ee8cc1Swenshuai.xi 	  goto repeat;
356*53ee8cc1Swenshuai.xi 	default:
357*53ee8cc1Swenshuai.xi 	  APP;
358*53ee8cc1Swenshuai.xi 	  goto repeat;
359*53ee8cc1Swenshuai.xi 	}
360*53ee8cc1Swenshuai.xi       break;
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi     case ST_TABLE_1:
363*53ee8cc1Swenshuai.xi       goto repeat;
364*53ee8cc1Swenshuai.xi 
365*53ee8cc1Swenshuai.xi     case ST_TABLE_2:
366*53ee8cc1Swenshuai.xi       if (token == IDENT && yyleng == 1 && yytext[0] == 'X')
367*53ee8cc1Swenshuai.xi 	{
368*53ee8cc1Swenshuai.xi 	  token = EXPORT_SYMBOL_KEYW;
369*53ee8cc1Swenshuai.xi 	  lexstate = ST_TABLE_5;
370*53ee8cc1Swenshuai.xi 	  APP;
371*53ee8cc1Swenshuai.xi 	  break;
372*53ee8cc1Swenshuai.xi 	}
373*53ee8cc1Swenshuai.xi       lexstate = ST_TABLE_6;
374*53ee8cc1Swenshuai.xi       /* FALLTHRU */
375*53ee8cc1Swenshuai.xi 
376*53ee8cc1Swenshuai.xi     case ST_TABLE_6:
377*53ee8cc1Swenshuai.xi       switch (token)
378*53ee8cc1Swenshuai.xi 	{
379*53ee8cc1Swenshuai.xi 	case '{': case '[': case '(':
380*53ee8cc1Swenshuai.xi 	  ++count;
381*53ee8cc1Swenshuai.xi 	  break;
382*53ee8cc1Swenshuai.xi 	case '}': case ']': case ')':
383*53ee8cc1Swenshuai.xi 	  --count;
384*53ee8cc1Swenshuai.xi 	  break;
385*53ee8cc1Swenshuai.xi 	case ',':
386*53ee8cc1Swenshuai.xi 	  if (count == 0)
387*53ee8cc1Swenshuai.xi 	    lexstate = ST_TABLE_2;
388*53ee8cc1Swenshuai.xi 	  break;
389*53ee8cc1Swenshuai.xi 	};
390*53ee8cc1Swenshuai.xi       goto repeat;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi     case ST_TABLE_3:
393*53ee8cc1Swenshuai.xi       goto repeat;
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi     case ST_TABLE_4:
396*53ee8cc1Swenshuai.xi       if (token == ';')
397*53ee8cc1Swenshuai.xi 	lexstate = ST_NORMAL;
398*53ee8cc1Swenshuai.xi       goto repeat;
399*53ee8cc1Swenshuai.xi 
400*53ee8cc1Swenshuai.xi     case ST_TABLE_5:
401*53ee8cc1Swenshuai.xi       switch (token)
402*53ee8cc1Swenshuai.xi 	{
403*53ee8cc1Swenshuai.xi 	case ',':
404*53ee8cc1Swenshuai.xi 	  token = ';';
405*53ee8cc1Swenshuai.xi 	  lexstate = ST_TABLE_2;
406*53ee8cc1Swenshuai.xi 	  APP;
407*53ee8cc1Swenshuai.xi 	  break;
408*53ee8cc1Swenshuai.xi 	default:
409*53ee8cc1Swenshuai.xi 	  APP;
410*53ee8cc1Swenshuai.xi 	  break;
411*53ee8cc1Swenshuai.xi 	}
412*53ee8cc1Swenshuai.xi       break;
413*53ee8cc1Swenshuai.xi 
414*53ee8cc1Swenshuai.xi     default:
415*53ee8cc1Swenshuai.xi       exit(1);
416*53ee8cc1Swenshuai.xi     }
417*53ee8cc1Swenshuai.xi fini:
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi   if (suppress_type_lookup > 0)
420*53ee8cc1Swenshuai.xi     --suppress_type_lookup;
421*53ee8cc1Swenshuai.xi   if (dont_want_brace_phrase > 0)
422*53ee8cc1Swenshuai.xi     --dont_want_brace_phrase;
423*53ee8cc1Swenshuai.xi 
424*53ee8cc1Swenshuai.xi   yylval = &next_node->next;
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi   return token;
427*53ee8cc1Swenshuai.xi }
428