diff mbox series

[3/3] kconfig: use yylineno option instead of manual lineno increments

Message ID 1521738014-18895-3-git-send-email-yamada.masahiro@socionext.com
State Accepted
Commit 18492685e479fd4d8e1dca836f57c11b6800f083
Headers show
Series [1/3] kconfig: remove duplicated file name and lineno of recursive inclusion | expand

Commit Message

Masahiro Yamada March 22, 2018, 5 p.m. UTC
Tracking the line number by hand is error-prone since we need to make
sure to increment it in all the \n matching patterns.

If '%option yylineno' is set, flex defines 'yylineno' to contain the
current line number and automatically updates it each time it reads a
\n character.  This is much more convenient although the lexer does
not initializes yylineno, so you need to set it to 1 each time you
start reading a new file, and restore it you go back to the previous
file.

I tested this with DEBUG_PARSE, and confirmed the same dump message
was produced.

I removed the perf-report option.  Otherwise, I see the following
message:
  %option yylineno entails a performance penalty ONLY on rules that
  can match newline characters

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

---

 scripts/kconfig/lkc.h   |  1 +
 scripts/kconfig/zconf.l | 20 +++++++++-----------
 2 files changed, 10 insertions(+), 11 deletions(-)

-- 
2.7.4

Comments

Masahiro Yamada March 26, 2018, 3:25 p.m. UTC | #1
2018-03-23 2:00 GMT+09:00 Masahiro Yamada <yamada.masahiro@socionext.com>:
> Tracking the line number by hand is error-prone since we need to make

> sure to increment it in all the \n matching patterns.

>

> If '%option yylineno' is set, flex defines 'yylineno' to contain the

> current line number and automatically updates it each time it reads a

> \n character.  This is much more convenient although the lexer does

> not initializes yylineno, so you need to set it to 1 each time you

> start reading a new file, and restore it you go back to the previous

> file.

>

> I tested this with DEBUG_PARSE, and confirmed the same dump message

> was produced.

>

> I removed the perf-report option.  Otherwise, I see the following

> message:

>   %option yylineno entails a performance penalty ONLY on rules that

>   can match newline characters

>

> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>

> ---


Applied to linux-kbuild/kconfig.



-- 
Best Regards
Masahiro Yamada
diff mbox series

Patch

diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
index 2d5ec2d..f4394af 100644
--- a/scripts/kconfig/lkc.h
+++ b/scripts/kconfig/lkc.h
@@ -68,6 +68,7 @@  struct kconf_id {
 	enum symbol_type stype;
 };
 
+extern int yylineno;
 void zconfdump(FILE *out);
 void zconf_starthelp(void);
 FILE *zconf_fopen(const char *name);
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
index 29b5d33..045093d 100644
--- a/scripts/kconfig/zconf.l
+++ b/scripts/kconfig/zconf.l
@@ -1,5 +1,5 @@ 
 %option nostdinit noyywrap never-interactive full ecs
-%option 8bit nodefault perf-report perf-report
+%option 8bit nodefault yylineno
 %option noinput
 %x COMMAND HELP STRING PARAM
 %{
@@ -83,7 +83,6 @@  n	[A-Za-z0-9_-]
 
 [ \t]*#.*\n	|
 [ \t]*\n	{
-	current_file->lineno++;
 	return T_EOL;
 }
 [ \t]*#.*
@@ -104,7 +103,7 @@  n	[A-Za-z0-9_-]
 		const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
 		BEGIN(PARAM);
 		current_pos.file = current_file;
-		current_pos.lineno = current_file->lineno;
+		current_pos.lineno = yylineno;
 		if (id && id->flags & TF_COMMAND) {
 			yylval.id = id;
 			return id->token;
@@ -116,7 +115,6 @@  n	[A-Za-z0-9_-]
 	.	warn_ignored_character(*yytext);
 	\n	{
 		BEGIN(INITIAL);
-		current_file->lineno++;
 		return T_EOL;
 	}
 }
@@ -138,7 +136,7 @@  n	[A-Za-z0-9_-]
 		new_string();
 		BEGIN(STRING);
 	}
-	\n	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	\n	BEGIN(INITIAL); return T_EOL;
 	({n}|[/.])+	{
 		const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
 		if (id && id->flags & TF_PARAM) {
@@ -150,7 +148,7 @@  n	[A-Za-z0-9_-]
 		return T_WORD;
 	}
 	#.*	/* comment */
-	\\\n	current_file->lineno++;
+	\\\n	;
 	[[:blank:]]+
 	.	warn_ignored_character(*yytext);
 	<<EOF>> {
@@ -187,7 +185,6 @@  n	[A-Za-z0-9_-]
 		fprintf(stderr,
 			"%s:%d:warning: multi-line strings not supported\n",
 			zconf_curname(), zconf_lineno());
-		current_file->lineno++;
 		BEGIN(INITIAL);
 		return T_EOL;
 	}
@@ -220,12 +217,10 @@  n	[A-Za-z0-9_-]
 		}
 	}
 	[ \t]*\n/[^ \t\n] {
-		current_file->lineno++;
 		zconf_endhelp();
 		return T_HELPTEXT;
 	}
 	[ \t]*\n	{
-		current_file->lineno++;
 		append_string("\n", 1);
 	}
 	[^ \t\n].* {
@@ -304,7 +299,7 @@  void zconf_initscan(const char *name)
 	memset(current_buf, 0, sizeof(*current_buf));
 
 	current_file = file_lookup(name);
-	current_file->lineno = 1;
+	yylineno = 1;
 }
 
 void zconf_nextfile(const char *name)
@@ -325,6 +320,7 @@  void zconf_nextfile(const char *name)
 	buf->parent = current_buf;
 	current_buf = buf;
 
+	current_file->lineno = yylineno;
 	file->parent = current_file;
 
 	for (iter = current_file; iter; iter = iter->parent) {
@@ -343,7 +339,7 @@  void zconf_nextfile(const char *name)
 		}
 	}
 
-	file->lineno = 1;
+	yylineno = 1;
 	current_file = file;
 }
 
@@ -352,6 +348,8 @@  static void zconf_endfile(void)
 	struct buffer *parent;
 
 	current_file = current_file->parent;
+	if (current_file)
+		yylineno = current_file->lineno;
 
 	parent = current_buf->parent;
 	if (parent) {