int lineno;
} current_pos;
+static int prev_prev_token = T_EOL;
static int prev_token = T_EOL;
static char *text;
static int text_size, text_asize;
<COMMAND>{
{n}+ {
const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
- current_pos.file = current_file;
- current_pos.lineno = yylineno;
if (id && id->flags & TF_COMMAND) {
BEGIN(PARAM);
return id->token;
return T_WORD;
free(yylval.string);
}
- "=" { BEGIN(ASSIGN_VAL); return T_EQUAL; }
- ":=" { BEGIN(ASSIGN_VAL); return T_COLON_EQUAL; }
- "+=" { BEGIN(ASSIGN_VAL); return T_PLUS_EQUAL; }
+ "=" return T_EQUAL;
+ ":=" return T_COLON_EQUAL;
+ "+=" return T_PLUS_EQUAL;
[[:blank:]]+
. warn_ignored_character(*yytext);
\n {
repeat:
token = yylex1();
- /* Do not pass unneeded T_EOL to the parser. */
- if ((prev_token == T_EOL || prev_token == T_HELPTEXT) && token == T_EOL)
- goto repeat;
+ if (prev_token == T_EOL || prev_token == T_HELPTEXT) {
+ if (token == T_EOL) {
+ /* Do not pass unneeded T_EOL to the parser. */
+ goto repeat;
+ } else {
+ /*
+ * For the parser, update file/lineno at the first token
+ * of each statement. Generally, \n is a statement
+ * terminator in Kconfig, but it is not always true
+ * because \n could be escaped by a backslash.
+ */
+ current_pos.file = current_file;
+ current_pos.lineno = yylineno;
+ }
+ }
+
+ if (prev_prev_token == T_EOL && prev_token == T_WORD &&
+ (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL))
+ BEGIN(ASSIGN_VAL);
+ prev_prev_token = prev_token;
prev_token = token;
return token;