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)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 21:32:21 +0000 (22:32 +0100)
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>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/zconf.l

index 5341e5431f3b22024865989a0bf565adb3b95ea9..052a9864b7ec5bd2a5b09f3313f10408d8b3538e 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))