kconfig: update current_pos in the second lexer
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 11 Dec 2018 11:01:09 +0000 (20:01 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Fri, 21 Dec 2018 15:25:56 +0000 (00:25 +0900)
To simplify the generated lexer, let the hand-made lexer update the
file name and line number for the parser.

I tested this with DEBUG_PARSE, and confirmed the same file names
and line numbers were dumped.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
scripts/kconfig/zconf.l

index 05e2d95e3b220bad808b91f400fd9faf835d795b..9b083a176fb42fffe7753e37af460e39dc650fac 100644 (file)
@@ -101,8 +101,6 @@ n   [A-Za-z0-9_-]
 <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;
@@ -285,9 +283,21 @@ int yylex(void)
 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))