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