summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
04b4b91)
Tracking the line number by hand is error-prone since you need to
increment it in every \n matching pattern.
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>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
enum symbol_type stype;
};
enum symbol_type stype;
};
void zconfdump(FILE *out);
void zconf_starthelp(void);
FILE *zconf_fopen(const char *name);
void zconfdump(FILE *out);
void zconf_starthelp(void);
FILE *zconf_fopen(const char *name);
%option nostdinit noyywrap never-interactive full ecs
%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
%{
%option noinput
%x COMMAND HELP STRING PARAM
%{
- current_file->lineno++;
return T_EOL;
}
[ \t]*#.*
return T_EOL;
}
[ \t]*#.*
const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
BEGIN(PARAM);
current_pos.file = current_file;
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;
if (id && id->flags & TF_COMMAND) {
yylval.id = id;
return id->token;
. warn_ignored_character(*yytext);
\n {
BEGIN(INITIAL);
. warn_ignored_character(*yytext);
\n {
BEGIN(INITIAL);
- current_file->lineno++;
new_string();
BEGIN(STRING);
}
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) {
({n}|[/.])+ {
const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
if (id && id->flags & TF_PARAM) {
return T_WORD;
}
#.* /* comment */
return T_WORD;
}
#.* /* comment */
- \\\n current_file->lineno++;
[[:blank:]]+
. warn_ignored_character(*yytext);
<<EOF>> {
[[:blank:]]+
. warn_ignored_character(*yytext);
<<EOF>> {
fprintf(stderr,
"%s:%d:warning: multi-line strings not supported\n",
zconf_curname(), zconf_lineno());
fprintf(stderr,
"%s:%d:warning: multi-line strings not supported\n",
zconf_curname(), zconf_lineno());
- current_file->lineno++;
BEGIN(INITIAL);
return T_EOL;
}
BEGIN(INITIAL);
return T_EOL;
}
- current_file->lineno++;
zconf_endhelp();
return T_HELPTEXT;
}
[ \t]*\n {
zconf_endhelp();
return T_HELPTEXT;
}
[ \t]*\n {
- current_file->lineno++;
append_string("\n", 1);
}
[^ \t\n].* {
append_string("\n", 1);
}
[^ \t\n].* {
memset(current_buf, 0, sizeof(*current_buf));
current_file = file_lookup(name);
memset(current_buf, 0, sizeof(*current_buf));
current_file = file_lookup(name);
- current_file->lineno = 1;
}
void zconf_nextfile(const char *name)
}
void zconf_nextfile(const char *name)
buf->parent = current_buf;
current_buf = buf;
buf->parent = current_buf;
current_buf = buf;
+ current_file->lineno = yylineno;
file->parent = current_file;
for (iter = current_file; iter; iter = iter->parent) {
file->parent = current_file;
for (iter = current_file; iter; iter = iter->parent) {
struct buffer *parent;
current_file = current_file->parent;
struct buffer *parent;
current_file = current_file->parent;
+ if (current_file)
+ yylineno = current_file->lineno;
parent = current_buf->parent;
if (parent) {
parent = current_buf->parent;
if (parent) {