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