parser: accept #line NUM

* src/scan-gram.l (scanner): Accept '#line NUM'.
(handle_syncline): Adjust to the possible missing file name.
This commit is contained in:
Akim Demaille
2012-12-03 15:59:57 +01:00
parent 1c7ec959b1
commit 03dbf629d5

View File

@@ -157,7 +157,7 @@ splice (\\[ \f\t\v]*\n)*
/* #line directives are not documented, and may be withdrawn or /* #line directives are not documented, and may be withdrawn or
modified in future versions of Bison. */ modified in future versions of Bison. */
^"#line "{int}" \"".*"\"\n" { ^"#line "{int}(" \"".*"\"")?"\n" {
handle_syncline (yytext + sizeof "#line " - 1, *loc); handle_syncline (yytext + sizeof "#line " - 1, *loc);
} }
} }
@@ -845,23 +845,27 @@ convert_ucn_to_byte (char const *ucn)
} }
/*----------------------------------------------------------------. /*---------------------------------------------------------------------.
| Handle '#line INT "FILE"'. ARGS has already skipped '#line '. | | Handle '#line INT( "FILE")?\n'. ARGS has already skipped '#line '. |
`----------------------------------------------------------------*/ `---------------------------------------------------------------------*/
static void static void
handle_syncline (char *args, location loc) handle_syncline (char *args, location loc)
{ {
char *after_num; char *file;
unsigned long int lineno = strtoul (args, &after_num, 10); unsigned long int lineno = strtoul (args, &file, 10);
char *file = mbschr (after_num, '"') + 1;
*mbschr (file, '"') = '\0';
if (INT_MAX <= lineno) if (INT_MAX <= lineno)
{ {
warn_at (loc, _("line number overflow")); warn_at (loc, _("line number overflow"));
lineno = INT_MAX; lineno = INT_MAX;
} }
current_file = uniqstr_new (file);
file = mbschr (file, '"');
if (file)
{
*mbschr (file + 1, '"') = '\0';
current_file = uniqstr_new (file + 1);
}
boundary_set (&scanner_cursor, current_file, lineno, 1); boundary_set (&scanner_cursor, current_file, lineno, 1);
} }