162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Lexical analysis for genksyms.
462306a36Sopenharmony_ci * Copyright 1996, 1997 Linux International.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * New implementation contributed by Richard Henderson <rth@tamu.edu>
762306a36Sopenharmony_ci * Based on original work by Bjorn Ekwall <bj0rn@blox.se>
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Taken from Linux modutils 2.4.22.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci%{
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <limits.h>
1562306a36Sopenharmony_ci#include <stdlib.h>
1662306a36Sopenharmony_ci#include <string.h>
1762306a36Sopenharmony_ci#include <ctype.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "genksyms.h"
2062306a36Sopenharmony_ci#include "parse.tab.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* We've got a two-level lexer here.  We let flex do basic tokenization
2362306a36Sopenharmony_ci   and then we categorize those basic tokens in the second stage.  */
2462306a36Sopenharmony_ci#define YY_DECL		static int yylex1(void)
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci%}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciIDENT			[A-Za-z_\$][A-Za-z0-9_\$]*
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciO_INT			0[0-7]*
3162306a36Sopenharmony_ciD_INT			[1-9][0-9]*
3262306a36Sopenharmony_ciX_INT			0[Xx][0-9A-Fa-f]+
3362306a36Sopenharmony_ciI_SUF			[Uu]|[Ll]|[Uu][Ll]|[Ll][Uu]
3462306a36Sopenharmony_ciINT			({O_INT}|{D_INT}|{X_INT}){I_SUF}?
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciFRAC			([0-9]*\.[0-9]+)|([0-9]+\.)
3762306a36Sopenharmony_ciEXP			[Ee][+-]?[0-9]+
3862306a36Sopenharmony_ciF_SUF			[FfLl]
3962306a36Sopenharmony_ciREAL			({FRAC}{EXP}?{F_SUF}?)|([0-9]+{EXP}{F_SUF}?)
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ciSTRING			L?\"([^\\\"]*\\.)*[^\\\"]*\"
4262306a36Sopenharmony_ciCHAR			L?\'([^\\\']*\\.)*[^\\\']*\'
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciMC_TOKEN		([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* We don't do multiple input files.  */
4762306a36Sopenharmony_ci%option noyywrap
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci%option noinput
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci%%
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci /* Keep track of our location in the original source files.  */
5562306a36Sopenharmony_ci^#[ \t]+{INT}[ \t]+\"[^\"\n]+\".*\n	return FILENAME;
5662306a36Sopenharmony_ci^#.*\n					cur_line++;
5762306a36Sopenharmony_ci\n					cur_line++;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci /* Ignore all other whitespace.  */
6062306a36Sopenharmony_ci[ \t\f\v\r]+				;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci{STRING}				return STRING;
6462306a36Sopenharmony_ci{CHAR}					return CHAR;
6562306a36Sopenharmony_ci{IDENT}					return IDENT;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci /* The Pedant requires that the other C multi-character tokens be
6862306a36Sopenharmony_ci    recognized as tokens.  We don't actually use them since we don't
6962306a36Sopenharmony_ci    parse expressions, but we do want whitespace to be arranged
7062306a36Sopenharmony_ci    around them properly.  */
7162306a36Sopenharmony_ci{MC_TOKEN}				return OTHER;
7262306a36Sopenharmony_ci{INT}					return INT;
7362306a36Sopenharmony_ci{REAL}					return REAL;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci"..."					return DOTS;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci /* All other tokens are single characters.  */
7862306a36Sopenharmony_ci.					return yytext[0];
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci%%
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Bring in the keyword recognizer.  */
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#include "keywords.c"
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* Macros to append to our phrase collection list.  */
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/*
9162306a36Sopenharmony_ci * We mark any token, that that equals to a known enumerator, as
9262306a36Sopenharmony_ci * SYM_ENUM_CONST. The parser will change this for struct and union tags later,
9362306a36Sopenharmony_ci * the only problem is struct and union members:
9462306a36Sopenharmony_ci *    enum e { a, b }; struct s { int a, b; }
9562306a36Sopenharmony_ci * but in this case, the only effect will be, that the ABI checksums become
9662306a36Sopenharmony_ci * more volatile, which is acceptable. Also, such collisions are quite rare,
9762306a36Sopenharmony_ci * so far it was only observed in include/linux/telephony.h.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci#define _APP(T,L)	do {						   \
10062306a36Sopenharmony_ci			  cur_node = next_node;				   \
10162306a36Sopenharmony_ci			  next_node = xmalloc(sizeof(*next_node));	   \
10262306a36Sopenharmony_ci			  next_node->next = cur_node;			   \
10362306a36Sopenharmony_ci			  cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
10462306a36Sopenharmony_ci			  cur_node->tag =				   \
10562306a36Sopenharmony_ci			    find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
10662306a36Sopenharmony_ci			    SYM_ENUM_CONST : SYM_NORMAL ;		   \
10762306a36Sopenharmony_ci			  cur_node->in_source_file = in_source_file;       \
10862306a36Sopenharmony_ci			} while (0)
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci#define APP		_APP(yytext, yyleng)
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci/* The second stage lexer.  Here we incorporate knowledge of the state
11462306a36Sopenharmony_ci   of the parser to tailor the tokens that are returned.  */
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciint
11762306a36Sopenharmony_ciyylex(void)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci  static enum {
12062306a36Sopenharmony_ci    ST_NOTSTARTED, ST_NORMAL, ST_ATTRIBUTE, ST_ASM, ST_TYPEOF, ST_TYPEOF_1,
12162306a36Sopenharmony_ci    ST_BRACKET, ST_BRACE, ST_EXPRESSION, ST_STATIC_ASSERT,
12262306a36Sopenharmony_ci  } lexstate = ST_NOTSTARTED;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci  static int suppress_type_lookup, dont_want_brace_phrase;
12562306a36Sopenharmony_ci  static struct string_list *next_node;
12662306a36Sopenharmony_ci  static char *source_file;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci  int token, count = 0;
12962306a36Sopenharmony_ci  struct string_list *cur_node;
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci  if (lexstate == ST_NOTSTARTED)
13262306a36Sopenharmony_ci    {
13362306a36Sopenharmony_ci      next_node = xmalloc(sizeof(*next_node));
13462306a36Sopenharmony_ci      next_node->next = NULL;
13562306a36Sopenharmony_ci      lexstate = ST_NORMAL;
13662306a36Sopenharmony_ci    }
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_cirepeat:
13962306a36Sopenharmony_ci  token = yylex1();
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci  if (token == 0)
14262306a36Sopenharmony_ci    return 0;
14362306a36Sopenharmony_ci  else if (token == FILENAME)
14462306a36Sopenharmony_ci    {
14562306a36Sopenharmony_ci      char *file, *e;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci      /* Save the filename and line number for later error messages.  */
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci      if (cur_filename)
15062306a36Sopenharmony_ci	free(cur_filename);
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci      file = strchr(yytext, '\"')+1;
15362306a36Sopenharmony_ci      e = strchr(file, '\"');
15462306a36Sopenharmony_ci      *e = '\0';
15562306a36Sopenharmony_ci      cur_filename = memcpy(xmalloc(e-file+1), file, e-file+1);
15662306a36Sopenharmony_ci      cur_line = atoi(yytext+2);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci      if (!source_file) {
15962306a36Sopenharmony_ci        source_file = xstrdup(cur_filename);
16062306a36Sopenharmony_ci        in_source_file = 1;
16162306a36Sopenharmony_ci      } else {
16262306a36Sopenharmony_ci        in_source_file = (strcmp(cur_filename, source_file) == 0);
16362306a36Sopenharmony_ci      }
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci      goto repeat;
16662306a36Sopenharmony_ci    }
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci  switch (lexstate)
16962306a36Sopenharmony_ci    {
17062306a36Sopenharmony_ci    case ST_NORMAL:
17162306a36Sopenharmony_ci      switch (token)
17262306a36Sopenharmony_ci	{
17362306a36Sopenharmony_ci	case IDENT:
17462306a36Sopenharmony_ci	  APP;
17562306a36Sopenharmony_ci	  {
17662306a36Sopenharmony_ci	    int r = is_reserved_word(yytext, yyleng);
17762306a36Sopenharmony_ci	    if (r >= 0)
17862306a36Sopenharmony_ci	      {
17962306a36Sopenharmony_ci		switch (token = r)
18062306a36Sopenharmony_ci		  {
18162306a36Sopenharmony_ci		  case ATTRIBUTE_KEYW:
18262306a36Sopenharmony_ci		    lexstate = ST_ATTRIBUTE;
18362306a36Sopenharmony_ci		    count = 0;
18462306a36Sopenharmony_ci		    goto repeat;
18562306a36Sopenharmony_ci		  case ASM_KEYW:
18662306a36Sopenharmony_ci		    lexstate = ST_ASM;
18762306a36Sopenharmony_ci		    count = 0;
18862306a36Sopenharmony_ci		    goto repeat;
18962306a36Sopenharmony_ci		  case TYPEOF_KEYW:
19062306a36Sopenharmony_ci		    lexstate = ST_TYPEOF;
19162306a36Sopenharmony_ci		    count = 0;
19262306a36Sopenharmony_ci		    goto repeat;
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci		  case STRUCT_KEYW:
19562306a36Sopenharmony_ci		  case UNION_KEYW:
19662306a36Sopenharmony_ci		  case ENUM_KEYW:
19762306a36Sopenharmony_ci		    dont_want_brace_phrase = 3;
19862306a36Sopenharmony_ci		    suppress_type_lookup = 2;
19962306a36Sopenharmony_ci		    goto fini;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci		  case EXPORT_SYMBOL_KEYW:
20262306a36Sopenharmony_ci		      goto fini;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci		  case STATIC_ASSERT_KEYW:
20562306a36Sopenharmony_ci		    lexstate = ST_STATIC_ASSERT;
20662306a36Sopenharmony_ci		    count = 0;
20762306a36Sopenharmony_ci		    goto repeat;
20862306a36Sopenharmony_ci		  }
20962306a36Sopenharmony_ci	      }
21062306a36Sopenharmony_ci	    if (!suppress_type_lookup)
21162306a36Sopenharmony_ci	      {
21262306a36Sopenharmony_ci		if (find_symbol(yytext, SYM_TYPEDEF, 1))
21362306a36Sopenharmony_ci		  token = TYPE;
21462306a36Sopenharmony_ci	      }
21562306a36Sopenharmony_ci	  }
21662306a36Sopenharmony_ci	  break;
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	case '[':
21962306a36Sopenharmony_ci	  APP;
22062306a36Sopenharmony_ci	  lexstate = ST_BRACKET;
22162306a36Sopenharmony_ci	  count = 1;
22262306a36Sopenharmony_ci	  goto repeat;
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	case '{':
22562306a36Sopenharmony_ci	  APP;
22662306a36Sopenharmony_ci	  if (dont_want_brace_phrase)
22762306a36Sopenharmony_ci	    break;
22862306a36Sopenharmony_ci	  lexstate = ST_BRACE;
22962306a36Sopenharmony_ci	  count = 1;
23062306a36Sopenharmony_ci	  goto repeat;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	case '=': case ':':
23362306a36Sopenharmony_ci	  APP;
23462306a36Sopenharmony_ci	  lexstate = ST_EXPRESSION;
23562306a36Sopenharmony_ci	  break;
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	default:
23862306a36Sopenharmony_ci	  APP;
23962306a36Sopenharmony_ci	  break;
24062306a36Sopenharmony_ci	}
24162306a36Sopenharmony_ci      break;
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci    case ST_ATTRIBUTE:
24462306a36Sopenharmony_ci      APP;
24562306a36Sopenharmony_ci      switch (token)
24662306a36Sopenharmony_ci	{
24762306a36Sopenharmony_ci	case '(':
24862306a36Sopenharmony_ci	  ++count;
24962306a36Sopenharmony_ci	  goto repeat;
25062306a36Sopenharmony_ci	case ')':
25162306a36Sopenharmony_ci	  if (--count == 0)
25262306a36Sopenharmony_ci	    {
25362306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
25462306a36Sopenharmony_ci	      token = ATTRIBUTE_PHRASE;
25562306a36Sopenharmony_ci	      break;
25662306a36Sopenharmony_ci	    }
25762306a36Sopenharmony_ci	  goto repeat;
25862306a36Sopenharmony_ci	default:
25962306a36Sopenharmony_ci	  goto repeat;
26062306a36Sopenharmony_ci	}
26162306a36Sopenharmony_ci      break;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci    case ST_ASM:
26462306a36Sopenharmony_ci      APP;
26562306a36Sopenharmony_ci      switch (token)
26662306a36Sopenharmony_ci	{
26762306a36Sopenharmony_ci	case '(':
26862306a36Sopenharmony_ci	  ++count;
26962306a36Sopenharmony_ci	  goto repeat;
27062306a36Sopenharmony_ci	case ')':
27162306a36Sopenharmony_ci	  if (--count == 0)
27262306a36Sopenharmony_ci	    {
27362306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
27462306a36Sopenharmony_ci	      token = ASM_PHRASE;
27562306a36Sopenharmony_ci	      break;
27662306a36Sopenharmony_ci	    }
27762306a36Sopenharmony_ci	  goto repeat;
27862306a36Sopenharmony_ci	default:
27962306a36Sopenharmony_ci	  goto repeat;
28062306a36Sopenharmony_ci	}
28162306a36Sopenharmony_ci      break;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci    case ST_TYPEOF_1:
28462306a36Sopenharmony_ci      if (token == IDENT)
28562306a36Sopenharmony_ci	{
28662306a36Sopenharmony_ci	  if (is_reserved_word(yytext, yyleng) >= 0
28762306a36Sopenharmony_ci	      || find_symbol(yytext, SYM_TYPEDEF, 1))
28862306a36Sopenharmony_ci	    {
28962306a36Sopenharmony_ci	      yyless(0);
29062306a36Sopenharmony_ci	      unput('(');
29162306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
29262306a36Sopenharmony_ci	      token = TYPEOF_KEYW;
29362306a36Sopenharmony_ci	      break;
29462306a36Sopenharmony_ci	    }
29562306a36Sopenharmony_ci	  _APP("(", 1);
29662306a36Sopenharmony_ci	}
29762306a36Sopenharmony_ci	lexstate = ST_TYPEOF;
29862306a36Sopenharmony_ci	/* FALLTHRU */
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci    case ST_TYPEOF:
30162306a36Sopenharmony_ci      switch (token)
30262306a36Sopenharmony_ci	{
30362306a36Sopenharmony_ci	case '(':
30462306a36Sopenharmony_ci	  if ( ++count == 1 )
30562306a36Sopenharmony_ci	    lexstate = ST_TYPEOF_1;
30662306a36Sopenharmony_ci	  else
30762306a36Sopenharmony_ci	    APP;
30862306a36Sopenharmony_ci	  goto repeat;
30962306a36Sopenharmony_ci	case ')':
31062306a36Sopenharmony_ci	  APP;
31162306a36Sopenharmony_ci	  if (--count == 0)
31262306a36Sopenharmony_ci	    {
31362306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
31462306a36Sopenharmony_ci	      token = TYPEOF_PHRASE;
31562306a36Sopenharmony_ci	      break;
31662306a36Sopenharmony_ci	    }
31762306a36Sopenharmony_ci	  goto repeat;
31862306a36Sopenharmony_ci	default:
31962306a36Sopenharmony_ci	  APP;
32062306a36Sopenharmony_ci	  goto repeat;
32162306a36Sopenharmony_ci	}
32262306a36Sopenharmony_ci      break;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci    case ST_BRACKET:
32562306a36Sopenharmony_ci      APP;
32662306a36Sopenharmony_ci      switch (token)
32762306a36Sopenharmony_ci	{
32862306a36Sopenharmony_ci	case '[':
32962306a36Sopenharmony_ci	  ++count;
33062306a36Sopenharmony_ci	  goto repeat;
33162306a36Sopenharmony_ci	case ']':
33262306a36Sopenharmony_ci	  if (--count == 0)
33362306a36Sopenharmony_ci	    {
33462306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
33562306a36Sopenharmony_ci	      token = BRACKET_PHRASE;
33662306a36Sopenharmony_ci	      break;
33762306a36Sopenharmony_ci	    }
33862306a36Sopenharmony_ci	  goto repeat;
33962306a36Sopenharmony_ci	default:
34062306a36Sopenharmony_ci	  goto repeat;
34162306a36Sopenharmony_ci	}
34262306a36Sopenharmony_ci      break;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci    case ST_BRACE:
34562306a36Sopenharmony_ci      APP;
34662306a36Sopenharmony_ci      switch (token)
34762306a36Sopenharmony_ci	{
34862306a36Sopenharmony_ci	case '{':
34962306a36Sopenharmony_ci	  ++count;
35062306a36Sopenharmony_ci	  goto repeat;
35162306a36Sopenharmony_ci	case '}':
35262306a36Sopenharmony_ci	  if (--count == 0)
35362306a36Sopenharmony_ci	    {
35462306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
35562306a36Sopenharmony_ci	      token = BRACE_PHRASE;
35662306a36Sopenharmony_ci	      break;
35762306a36Sopenharmony_ci	    }
35862306a36Sopenharmony_ci	  goto repeat;
35962306a36Sopenharmony_ci	default:
36062306a36Sopenharmony_ci	  goto repeat;
36162306a36Sopenharmony_ci	}
36262306a36Sopenharmony_ci      break;
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci    case ST_EXPRESSION:
36562306a36Sopenharmony_ci      switch (token)
36662306a36Sopenharmony_ci	{
36762306a36Sopenharmony_ci	case '(': case '[': case '{':
36862306a36Sopenharmony_ci	  ++count;
36962306a36Sopenharmony_ci	  APP;
37062306a36Sopenharmony_ci	  goto repeat;
37162306a36Sopenharmony_ci	case '}':
37262306a36Sopenharmony_ci	  /* is this the last line of an enum declaration? */
37362306a36Sopenharmony_ci	  if (count == 0)
37462306a36Sopenharmony_ci	    {
37562306a36Sopenharmony_ci	      /* Put back the token we just read so's we can find it again
37662306a36Sopenharmony_ci		 after registering the expression.  */
37762306a36Sopenharmony_ci	      unput(token);
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
38062306a36Sopenharmony_ci	      token = EXPRESSION_PHRASE;
38162306a36Sopenharmony_ci	      break;
38262306a36Sopenharmony_ci	    }
38362306a36Sopenharmony_ci	  /* FALLTHRU */
38462306a36Sopenharmony_ci	case ')': case ']':
38562306a36Sopenharmony_ci	  --count;
38662306a36Sopenharmony_ci	  APP;
38762306a36Sopenharmony_ci	  goto repeat;
38862306a36Sopenharmony_ci	case ',': case ';':
38962306a36Sopenharmony_ci	  if (count == 0)
39062306a36Sopenharmony_ci	    {
39162306a36Sopenharmony_ci	      /* Put back the token we just read so's we can find it again
39262306a36Sopenharmony_ci		 after registering the expression.  */
39362306a36Sopenharmony_ci	      unput(token);
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
39662306a36Sopenharmony_ci	      token = EXPRESSION_PHRASE;
39762306a36Sopenharmony_ci	      break;
39862306a36Sopenharmony_ci	    }
39962306a36Sopenharmony_ci	  APP;
40062306a36Sopenharmony_ci	  goto repeat;
40162306a36Sopenharmony_ci	default:
40262306a36Sopenharmony_ci	  APP;
40362306a36Sopenharmony_ci	  goto repeat;
40462306a36Sopenharmony_ci	}
40562306a36Sopenharmony_ci      break;
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci    case ST_STATIC_ASSERT:
40862306a36Sopenharmony_ci      APP;
40962306a36Sopenharmony_ci      switch (token)
41062306a36Sopenharmony_ci	{
41162306a36Sopenharmony_ci	case '(':
41262306a36Sopenharmony_ci	  ++count;
41362306a36Sopenharmony_ci	  goto repeat;
41462306a36Sopenharmony_ci	case ')':
41562306a36Sopenharmony_ci	  if (--count == 0)
41662306a36Sopenharmony_ci	    {
41762306a36Sopenharmony_ci	      lexstate = ST_NORMAL;
41862306a36Sopenharmony_ci	      token = STATIC_ASSERT_PHRASE;
41962306a36Sopenharmony_ci	      break;
42062306a36Sopenharmony_ci	    }
42162306a36Sopenharmony_ci	  goto repeat;
42262306a36Sopenharmony_ci	default:
42362306a36Sopenharmony_ci	  goto repeat;
42462306a36Sopenharmony_ci	}
42562306a36Sopenharmony_ci      break;
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_ci    default:
42862306a36Sopenharmony_ci      exit(1);
42962306a36Sopenharmony_ci    }
43062306a36Sopenharmony_cifini:
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ci  if (suppress_type_lookup > 0)
43362306a36Sopenharmony_ci    --suppress_type_lookup;
43462306a36Sopenharmony_ci  if (dont_want_brace_phrase > 0)
43562306a36Sopenharmony_ci    --dont_want_brace_phrase;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci  yylval = &next_node->next;
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci  return token;
44062306a36Sopenharmony_ci}
441