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