xref: /linux/scripts/genksyms/lex.l (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
177564a48SMasahiro Yamada /* SPDX-License-Identifier: GPL-2.0-or-later */
277564a48SMasahiro Yamada /*
377564a48SMasahiro Yamada  * Lexical analysis for genksyms.
477564a48SMasahiro Yamada  * Copyright 1996, 1997 Linux International.
577564a48SMasahiro Yamada  *
677564a48SMasahiro Yamada  * New implementation contributed by Richard Henderson <rth@tamu.edu>
777564a48SMasahiro Yamada  * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
877564a48SMasahiro Yamada  *
977564a48SMasahiro Yamada  * Taken from Linux modutils 2.4.22.
1077564a48SMasahiro Yamada  */
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds %{
131da177e4SLinus Torvalds 
141da177e4SLinus Torvalds #include <limits.h>
151da177e4SLinus Torvalds #include <stdlib.h>
161da177e4SLinus Torvalds #include <string.h>
171da177e4SLinus Torvalds #include <ctype.h>
181da177e4SLinus Torvalds 
191da177e4SLinus Torvalds #include "genksyms.h"
20880f4499SArnaud Lacombe #include "parse.tab.h"
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds /* We've got a two-level lexer here.  We let flex do basic tokenization
231da177e4SLinus Torvalds    and then we categorize those basic tokens in the second stage.  */
241da177e4SLinus Torvalds #define YY_DECL		static int yylex1(void)
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds %}
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds IDENT			[A-Za-z_\$][A-Za-z0-9_\$]*
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds O_INT			0[0-7]*
311da177e4SLinus Torvalds D_INT			[1-9][0-9]*
321da177e4SLinus Torvalds X_INT			0[Xx][0-9A-Fa-f]+
331da177e4SLinus Torvalds I_SUF			[Uu]|[Ll]|[Uu][Ll]|[Ll][Uu]
341da177e4SLinus Torvalds INT			({O_INT}|{D_INT}|{X_INT}){I_SUF}?
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds FRAC			([0-9]*\.[0-9]+)|([0-9]+\.)
371da177e4SLinus Torvalds EXP			[Ee][+-]?[0-9]+
381da177e4SLinus Torvalds F_SUF			[FfLl]
391da177e4SLinus Torvalds REAL			({FRAC}{EXP}?{F_SUF}?)|([0-9]+{EXP}{F_SUF}?)
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds STRING			L?\"([^\\\"]*\\.)*[^\\\"]*\"
421da177e4SLinus Torvalds CHAR			L?\'([^\\\']*\\.)*[^\\\']*\'
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds MC_TOKEN		([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds /* We don't do multiple input files.  */
471da177e4SLinus Torvalds %option noyywrap
481da177e4SLinus Torvalds 
4911ddad39SAdrian Bunk %option noinput
5011ddad39SAdrian Bunk 
511da177e4SLinus Torvalds %%
521da177e4SLinus Torvalds 
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds  /* Keep track of our location in the original source files.  */
551da177e4SLinus Torvalds ^#[ \t]+{INT}[ \t]+\"[^\"\n]+\".*\n	return FILENAME;
561da177e4SLinus Torvalds ^#.*\n					cur_line++;
571da177e4SLinus Torvalds \n					cur_line++;
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds  /* Ignore all other whitespace.  */
601da177e4SLinus Torvalds [ \t\f\v\r]+				;
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds 
631da177e4SLinus Torvalds {STRING}				return STRING;
641da177e4SLinus Torvalds {CHAR}					return CHAR;
651da177e4SLinus Torvalds {IDENT}					return IDENT;
661da177e4SLinus Torvalds 
671da177e4SLinus Torvalds  /* The Pedant requires that the other C multi-character tokens be
681da177e4SLinus Torvalds     recognized as tokens.  We don't actually use them since we don't
691da177e4SLinus Torvalds     parse expressions, but we do want whitespace to be arranged
701da177e4SLinus Torvalds     around them properly.  */
7195f1d639SMichal Marek {MC_TOKEN}				return OTHER;
7295f1d639SMichal Marek {INT}					return INT;
7395f1d639SMichal Marek {REAL}					return REAL;
741da177e4SLinus Torvalds 
751da177e4SLinus Torvalds "..."					return DOTS;
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds  /* All other tokens are single characters.  */
781da177e4SLinus Torvalds .					return yytext[0];
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds 
811da177e4SLinus Torvalds %%
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /* Bring in the keyword recognizer.  */
841da177e4SLinus Torvalds 
85bb3290d9SLinus Torvalds #include "keywords.c"
861da177e4SLinus Torvalds 
871da177e4SLinus Torvalds 
881da177e4SLinus Torvalds /* Macros to append to our phrase collection list.  */
891da177e4SLinus Torvalds 
90e37ddb82SMichal Marek /*
91e37ddb82SMichal Marek  * We mark any token, that that equals to a known enumerator, as
92e37ddb82SMichal Marek  * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
93e37ddb82SMichal Marek  * the only problem is struct and union members:
94e37ddb82SMichal Marek  *    enum e { a, b }; struct s { int a, b; }
95e37ddb82SMichal Marek  * but in this case, the only effect will be, that the ABI checksums become
96e37ddb82SMichal Marek  * more volatile, which is acceptable. Also, such collisions are quite rare,
97e37ddb82SMichal Marek  * so far it was only observed in include/linux/telephony.h.
98e37ddb82SMichal Marek  */
991da177e4SLinus Torvalds #define _APP(T,L)	do {						   \
1001da177e4SLinus Torvalds 			  cur_node = next_node;				   \
1011da177e4SLinus Torvalds 			  next_node = xmalloc(sizeof(*next_node));	   \
1021da177e4SLinus Torvalds 			  next_node->next = cur_node;			   \
1031da177e4SLinus Torvalds 			  cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
104e37ddb82SMichal Marek 			  cur_node->tag =				   \
105e37ddb82SMichal Marek 			    find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
106e37ddb82SMichal Marek 			    SYM_ENUM_CONST : SYM_NORMAL ;		   \
1072c5925d6SMichal Marek 			  cur_node->in_source_file = in_source_file;       \
1081da177e4SLinus Torvalds 			} while (0)
1091da177e4SLinus Torvalds 
1101da177e4SLinus Torvalds #define APP		_APP(yytext, yyleng)
1111da177e4SLinus Torvalds 
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds /* The second stage lexer.  Here we incorporate knowledge of the state
1141da177e4SLinus Torvalds    of the parser to tailor the tokens that are returned.  */
1151da177e4SLinus Torvalds 
1161da177e4SLinus Torvalds int
1171da177e4SLinus Torvalds yylex(void)
1181da177e4SLinus Torvalds {
1191da177e4SLinus Torvalds   static enum {
120dc533240SJan Beulich     ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1,
1219ab55d7fSMarco Elver     ST_BRACKET, ST_BRACE, ST_EXPRESSION, ST_STATIC_ASSERT,
1221da177e4SLinus Torvalds   } lexstate = ST_NOTSTARTED;
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds   static int suppress_type_lookup, dont_want_brace_phrase;
1251da177e4SLinus Torvalds   static struct string_list *next_node;
126*ab37d5a4SMasahiro Yamada   static char *source_file;
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds   int token, count = 0;
1291da177e4SLinus Torvalds   struct string_list *cur_node;
1301da177e4SLinus Torvalds 
1311da177e4SLinus Torvalds   if (lexstate == ST_NOTSTARTED)
1321da177e4SLinus Torvalds     {
1331da177e4SLinus Torvalds       next_node = xmalloc(sizeof(*next_node));
1341da177e4SLinus Torvalds       next_node->next = NULL;
1351da177e4SLinus Torvalds       lexstate = ST_NORMAL;
1361da177e4SLinus Torvalds     }
1371da177e4SLinus Torvalds 
1381da177e4SLinus Torvalds repeat:
1391da177e4SLinus Torvalds   token = yylex1();
1401da177e4SLinus Torvalds 
1411da177e4SLinus Torvalds   if (token == 0)
1421da177e4SLinus Torvalds     return 0;
1431da177e4SLinus Torvalds   else if (token == FILENAME)
1441da177e4SLinus Torvalds     {
1451da177e4SLinus Torvalds       char *file, *e;
1461da177e4SLinus Torvalds 
1471da177e4SLinus Torvalds       /* Save the filename and line number for later error messages.  */
1481da177e4SLinus Torvalds 
1491da177e4SLinus Torvalds       if (cur_filename)
1501da177e4SLinus Torvalds 	free(cur_filename);
1511da177e4SLinus Torvalds 
1521da177e4SLinus Torvalds       file = strchr(yytext, '\"')+1;
1531da177e4SLinus Torvalds       e = strchr(file, '\"');
1541da177e4SLinus Torvalds       *e = '\0';
1551da177e4SLinus Torvalds       cur_filename = memcpy(xmalloc(e-file+1), file, e-file+1);
1561da177e4SLinus Torvalds       cur_line = atoi(yytext+2);
1571da177e4SLinus Torvalds 
1582c5925d6SMichal Marek       if (!source_file) {
1592c5925d6SMichal Marek         source_file = xstrdup(cur_filename);
1602c5925d6SMichal Marek         in_source_file = 1;
1612c5925d6SMichal Marek       } else {
1622c5925d6SMichal Marek         in_source_file = (strcmp(cur_filename, source_file) == 0);
1632c5925d6SMichal Marek       }
1642c5925d6SMichal Marek 
1651da177e4SLinus Torvalds       goto repeat;
1661da177e4SLinus Torvalds     }
1671da177e4SLinus Torvalds 
1681da177e4SLinus Torvalds   switch (lexstate)
1691da177e4SLinus Torvalds     {
1701da177e4SLinus Torvalds     case ST_NORMAL:
1711da177e4SLinus Torvalds       switch (token)
1721da177e4SLinus Torvalds 	{
1731da177e4SLinus Torvalds 	case IDENT:
1741da177e4SLinus Torvalds 	  APP;
1751da177e4SLinus Torvalds 	  {
176bb3290d9SLinus Torvalds 	    int r = is_reserved_word(yytext, yyleng);
177bb3290d9SLinus Torvalds 	    if (r >= 0)
1781da177e4SLinus Torvalds 	      {
179bb3290d9SLinus Torvalds 		switch (token = r)
1801da177e4SLinus Torvalds 		  {
1811da177e4SLinus Torvalds 		  case ATTRIBUTE_KEYW:
1821da177e4SLinus Torvalds 		    lexstate = ST_ATTRIBUTE;
1831da177e4SLinus Torvalds 		    count = 0;
1841da177e4SLinus Torvalds 		    goto repeat;
1851da177e4SLinus Torvalds 		  case ASM_KEYW:
1861da177e4SLinus Torvalds 		    lexstate = ST_ASM;
1871da177e4SLinus Torvalds 		    count = 0;
1881da177e4SLinus Torvalds 		    goto repeat;
189dc533240SJan Beulich 		  case TYPEOF_KEYW:
190dc533240SJan Beulich 		    lexstate = ST_TYPEOF;
191dc533240SJan Beulich 		    count = 0;
192dc533240SJan Beulich 		    goto repeat;
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds 		  case STRUCT_KEYW:
1951da177e4SLinus Torvalds 		  case UNION_KEYW:
1961da177e4SLinus Torvalds 		  case ENUM_KEYW:
197e37ddb82SMichal Marek 		    dont_want_brace_phrase = 3;
1981da177e4SLinus Torvalds 		    suppress_type_lookup = 2;
1991da177e4SLinus Torvalds 		    goto fini;
2001da177e4SLinus Torvalds 
2011da177e4SLinus Torvalds 		  case EXPORT_SYMBOL_KEYW:
2021da177e4SLinus Torvalds 		      goto fini;
2039ab55d7fSMarco Elver 
2049ab55d7fSMarco Elver 		  case STATIC_ASSERT_KEYW:
2059ab55d7fSMarco Elver 		    lexstate = ST_STATIC_ASSERT;
2069ab55d7fSMarco Elver 		    count = 0;
2079ab55d7fSMarco Elver 		    goto repeat;
2081da177e4SLinus Torvalds 		  }
2091da177e4SLinus Torvalds 	      }
2101da177e4SLinus Torvalds 	    if (!suppress_type_lookup)
2111da177e4SLinus Torvalds 	      {
21201762c4eSMichal Marek 		if (find_symbol(yytext, SYM_TYPEDEF, 1))
2131da177e4SLinus Torvalds 		  token = TYPE;
2141da177e4SLinus Torvalds 	      }
2151da177e4SLinus Torvalds 	  }
2161da177e4SLinus Torvalds 	  break;
2171da177e4SLinus Torvalds 
2181da177e4SLinus Torvalds 	case '[':
2191da177e4SLinus Torvalds 	  APP;
2201da177e4SLinus Torvalds 	  lexstate = ST_BRACKET;
2211da177e4SLinus Torvalds 	  count = 1;
2221da177e4SLinus Torvalds 	  goto repeat;
2231da177e4SLinus Torvalds 
2241da177e4SLinus Torvalds 	case '{':
2251da177e4SLinus Torvalds 	  APP;
2261da177e4SLinus Torvalds 	  if (dont_want_brace_phrase)
2271da177e4SLinus Torvalds 	    break;
2281da177e4SLinus Torvalds 	  lexstate = ST_BRACE;
2291da177e4SLinus Torvalds 	  count = 1;
2301da177e4SLinus Torvalds 	  goto repeat;
2311da177e4SLinus Torvalds 
2321da177e4SLinus Torvalds 	case '=': case ':':
2331da177e4SLinus Torvalds 	  APP;
2341da177e4SLinus Torvalds 	  lexstate = ST_EXPRESSION;
2351da177e4SLinus Torvalds 	  break;
2361da177e4SLinus Torvalds 
2371da177e4SLinus Torvalds 	default:
2381da177e4SLinus Torvalds 	  APP;
2391da177e4SLinus Torvalds 	  break;
2401da177e4SLinus Torvalds 	}
2411da177e4SLinus Torvalds       break;
2421da177e4SLinus Torvalds 
2431da177e4SLinus Torvalds     case ST_ATTRIBUTE:
2441da177e4SLinus Torvalds       APP;
2451da177e4SLinus Torvalds       switch (token)
2461da177e4SLinus Torvalds 	{
2471da177e4SLinus Torvalds 	case '(':
2481da177e4SLinus Torvalds 	  ++count;
2491da177e4SLinus Torvalds 	  goto repeat;
2501da177e4SLinus Torvalds 	case ')':
2511da177e4SLinus Torvalds 	  if (--count == 0)
2521da177e4SLinus Torvalds 	    {
2531da177e4SLinus Torvalds 	      lexstate = ST_NORMAL;
2541da177e4SLinus Torvalds 	      token = ATTRIBUTE_PHRASE;
2551da177e4SLinus Torvalds 	      break;
2561da177e4SLinus Torvalds 	    }
2571da177e4SLinus Torvalds 	  goto repeat;
2581da177e4SLinus Torvalds 	default:
2591da177e4SLinus Torvalds 	  goto repeat;
2601da177e4SLinus Torvalds 	}
2611da177e4SLinus Torvalds       break;
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds     case ST_ASM:
2641da177e4SLinus Torvalds       APP;
2651da177e4SLinus Torvalds       switch (token)
2661da177e4SLinus Torvalds 	{
2671da177e4SLinus Torvalds 	case '(':
2681da177e4SLinus Torvalds 	  ++count;
2691da177e4SLinus Torvalds 	  goto repeat;
2701da177e4SLinus Torvalds 	case ')':
2711da177e4SLinus Torvalds 	  if (--count == 0)
2721da177e4SLinus Torvalds 	    {
2731da177e4SLinus Torvalds 	      lexstate = ST_NORMAL;
2741da177e4SLinus Torvalds 	      token = ASM_PHRASE;
2751da177e4SLinus Torvalds 	      break;
2761da177e4SLinus Torvalds 	    }
2771da177e4SLinus Torvalds 	  goto repeat;
2781da177e4SLinus Torvalds 	default:
2791da177e4SLinus Torvalds 	  goto repeat;
2801da177e4SLinus Torvalds 	}
2811da177e4SLinus Torvalds       break;
2821da177e4SLinus Torvalds 
2834fab9160SNicholas Piggin     case ST_TYPEOF_1:
2844fab9160SNicholas Piggin       if (token == IDENT)
2854fab9160SNicholas Piggin 	{
2863aea311cSLinus Torvalds 	  if (is_reserved_word(yytext, yyleng) >= 0
2874fab9160SNicholas Piggin 	      || find_symbol(yytext, SYM_TYPEDEF, 1))
2884fab9160SNicholas Piggin 	    {
2894fab9160SNicholas Piggin 	      yyless(0);
2904fab9160SNicholas Piggin 	      unput('(');
2914fab9160SNicholas Piggin 	      lexstate = ST_NORMAL;
2924fab9160SNicholas Piggin 	      token = TYPEOF_KEYW;
2934fab9160SNicholas Piggin 	      break;
2944fab9160SNicholas Piggin 	    }
2954fab9160SNicholas Piggin 	  _APP("(", 1);
2964fab9160SNicholas Piggin 	}
2974fab9160SNicholas Piggin 	lexstate = ST_TYPEOF;
2984fab9160SNicholas Piggin 	/* FALLTHRU */
2994fab9160SNicholas Piggin 
300dc533240SJan Beulich     case ST_TYPEOF:
301dc533240SJan Beulich       switch (token)
302dc533240SJan Beulich 	{
303dc533240SJan Beulich 	case '(':
304dc533240SJan Beulich 	  if ( ++count == 1 )
305dc533240SJan Beulich 	    lexstate = ST_TYPEOF_1;
306dc533240SJan Beulich 	  else
307dc533240SJan Beulich 	    APP;
308dc533240SJan Beulich 	  goto repeat;
309dc533240SJan Beulich 	case ')':
310dc533240SJan Beulich 	  APP;
311dc533240SJan Beulich 	  if (--count == 0)
312dc533240SJan Beulich 	    {
313dc533240SJan Beulich 	      lexstate = ST_NORMAL;
314dc533240SJan Beulich 	      token = TYPEOF_PHRASE;
315dc533240SJan Beulich 	      break;
316dc533240SJan Beulich 	    }
317dc533240SJan Beulich 	  goto repeat;
318dc533240SJan Beulich 	default:
319dc533240SJan Beulich 	  APP;
320dc533240SJan Beulich 	  goto repeat;
321dc533240SJan Beulich 	}
322dc533240SJan Beulich       break;
323dc533240SJan Beulich 
3241da177e4SLinus Torvalds     case ST_BRACKET:
3251da177e4SLinus Torvalds       APP;
3261da177e4SLinus Torvalds       switch (token)
3271da177e4SLinus Torvalds 	{
3281da177e4SLinus Torvalds 	case '[':
3291da177e4SLinus Torvalds 	  ++count;
3301da177e4SLinus Torvalds 	  goto repeat;
3311da177e4SLinus Torvalds 	case ']':
3321da177e4SLinus Torvalds 	  if (--count == 0)
3331da177e4SLinus Torvalds 	    {
3341da177e4SLinus Torvalds 	      lexstate = ST_NORMAL;
3351da177e4SLinus Torvalds 	      token = BRACKET_PHRASE;
3361da177e4SLinus Torvalds 	      break;
3371da177e4SLinus Torvalds 	    }
3381da177e4SLinus Torvalds 	  goto repeat;
3391da177e4SLinus Torvalds 	default:
3401da177e4SLinus Torvalds 	  goto repeat;
3411da177e4SLinus Torvalds 	}
3421da177e4SLinus Torvalds       break;
3431da177e4SLinus Torvalds 
3441da177e4SLinus Torvalds     case ST_BRACE:
3451da177e4SLinus Torvalds       APP;
3461da177e4SLinus Torvalds       switch (token)
3471da177e4SLinus Torvalds 	{
3481da177e4SLinus Torvalds 	case '{':
3491da177e4SLinus Torvalds 	  ++count;
3501da177e4SLinus Torvalds 	  goto repeat;
3511da177e4SLinus Torvalds 	case '}':
3521da177e4SLinus Torvalds 	  if (--count == 0)
3531da177e4SLinus Torvalds 	    {
3541da177e4SLinus Torvalds 	      lexstate = ST_NORMAL;
3551da177e4SLinus Torvalds 	      token = BRACE_PHRASE;
3561da177e4SLinus Torvalds 	      break;
3571da177e4SLinus Torvalds 	    }
3581da177e4SLinus Torvalds 	  goto repeat;
3591da177e4SLinus Torvalds 	default:
3601da177e4SLinus Torvalds 	  goto repeat;
3611da177e4SLinus Torvalds 	}
3621da177e4SLinus Torvalds       break;
3631da177e4SLinus Torvalds 
3641da177e4SLinus Torvalds     case ST_EXPRESSION:
3651da177e4SLinus Torvalds       switch (token)
3661da177e4SLinus Torvalds 	{
3671da177e4SLinus Torvalds 	case '(': case '[': case '{':
3681da177e4SLinus Torvalds 	  ++count;
3691da177e4SLinus Torvalds 	  APP;
3701da177e4SLinus Torvalds 	  goto repeat;
371e37ddb82SMichal Marek 	case '}':
372e37ddb82SMichal Marek 	  /* is this the last line of an enum declaration? */
373e37ddb82SMichal Marek 	  if (count == 0)
374e37ddb82SMichal Marek 	    {
375e37ddb82SMichal Marek 	      /* Put back the token we just read so's we can find it again
376e37ddb82SMichal Marek 		 after registering the expression.  */
377e37ddb82SMichal Marek 	      unput(token);
378e37ddb82SMichal Marek 
379e37ddb82SMichal Marek 	      lexstate = ST_NORMAL;
380e37ddb82SMichal Marek 	      token = EXPRESSION_PHRASE;
381e37ddb82SMichal Marek 	      break;
382e37ddb82SMichal Marek 	    }
383e37ddb82SMichal Marek 	  /* FALLTHRU */
384e37ddb82SMichal Marek 	case ')': case ']':
3851da177e4SLinus Torvalds 	  --count;
3861da177e4SLinus Torvalds 	  APP;
3871da177e4SLinus Torvalds 	  goto repeat;
3881da177e4SLinus Torvalds 	case ',': case ';':
3891da177e4SLinus Torvalds 	  if (count == 0)
3901da177e4SLinus Torvalds 	    {
3911da177e4SLinus Torvalds 	      /* Put back the token we just read so's we can find it again
3921da177e4SLinus Torvalds 		 after registering the expression.  */
3931da177e4SLinus Torvalds 	      unput(token);
3941da177e4SLinus Torvalds 
3951da177e4SLinus Torvalds 	      lexstate = ST_NORMAL;
3961da177e4SLinus Torvalds 	      token = EXPRESSION_PHRASE;
3971da177e4SLinus Torvalds 	      break;
3981da177e4SLinus Torvalds 	    }
3991da177e4SLinus Torvalds 	  APP;
4001da177e4SLinus Torvalds 	  goto repeat;
4011da177e4SLinus Torvalds 	default:
4021da177e4SLinus Torvalds 	  APP;
4031da177e4SLinus Torvalds 	  goto repeat;
4041da177e4SLinus Torvalds 	}
4051da177e4SLinus Torvalds       break;
4061da177e4SLinus Torvalds 
4079ab55d7fSMarco Elver     case ST_STATIC_ASSERT:
4089ab55d7fSMarco Elver       APP;
4099ab55d7fSMarco Elver       switch (token)
4109ab55d7fSMarco Elver 	{
4119ab55d7fSMarco Elver 	case '(':
4129ab55d7fSMarco Elver 	  ++count;
4139ab55d7fSMarco Elver 	  goto repeat;
4149ab55d7fSMarco Elver 	case ')':
4159ab55d7fSMarco Elver 	  if (--count == 0)
4169ab55d7fSMarco Elver 	    {
4179ab55d7fSMarco Elver 	      lexstate = ST_NORMAL;
4189ab55d7fSMarco Elver 	      token = STATIC_ASSERT_PHRASE;
4199ab55d7fSMarco Elver 	      break;
4209ab55d7fSMarco Elver 	    }
4219ab55d7fSMarco Elver 	  goto repeat;
4229ab55d7fSMarco Elver 	default:
4239ab55d7fSMarco Elver 	  goto repeat;
4249ab55d7fSMarco Elver 	}
4259ab55d7fSMarco Elver       break;
4269ab55d7fSMarco Elver 
4271da177e4SLinus Torvalds     default:
4286803dc0eSSam Ravnborg       exit(1);
4291da177e4SLinus Torvalds     }
4301da177e4SLinus Torvalds fini:
4311da177e4SLinus Torvalds 
4321da177e4SLinus Torvalds   if (suppress_type_lookup > 0)
4331da177e4SLinus Torvalds     --suppress_type_lookup;
4341da177e4SLinus Torvalds   if (dont_want_brace_phrase > 0)
4351da177e4SLinus Torvalds     --dont_want_brace_phrase;
4361da177e4SLinus Torvalds 
4371da177e4SLinus Torvalds   yylval = &next_node->next;
4381da177e4SLinus Torvalds 
4391da177e4SLinus Torvalds   return token;
4401da177e4SLinus Torvalds }
441