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