diff --git a/src/parse-gram.y b/src/parse-gram.y index b0f89eb0..fe0afce7 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -43,8 +43,9 @@ #include "named-ref.h" #include "quotearg.h" #include "reader.h" - #include "scan-gram.h" #include "scan-code.h" + #include "scan-gram.h" + #include "vasnprintf.h" #include "xmemdup0.h" static int current_prec = 0; @@ -81,6 +82,10 @@ string from the scanner (should be CODE). */ static char const *translate_code_braceless (char *code, location loc); + /* Handle a %name-prefix directive. */ + static void do_name_prefix (location const *loc, + char const *directive, char const *value); + /* Handle a %require directive. */ static void do_require (location const *loc, char const *version); @@ -190,7 +195,9 @@ %printer { fputs (quotearg_style (c_quoting_style, $$), yyo); } STRING %printer { fprintf (yyo, "{\n%s\n}", $$); } -%type BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag tag.opt variable +%type + BRACKETED_ID ID ID_COLON PERCENT_FLAG PERCENT_NAME_PREFIX TAG + tag tag.opt variable %printer { fputs ($$, yyo); } %printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID %printer { fprintf (yyo, "%s:", $$); } ID_COLON @@ -307,7 +314,7 @@ prologue_declaration: code_scanner_last_string_free (); } | "%language" STRING { language_argmatch ($2, grammar_prio, @1); } -| "%name-prefix" STRING { spec_name_prefix = $2; } +| "%name-prefix" STRING { do_name_prefix (&@$, $1, $2); } | "%no-lines" { no_lines_flag = true; } | "%nondeterministic-parser" { nondeterministic_parser = true; } | "%output" STRING { spec_outfile = $2; } @@ -846,6 +853,31 @@ add_param (param_type type, char *decl, location loc) } +static void +do_name_prefix (location const *loc, + char const *directive, char const *value) +{ + spec_name_prefix = value; + + char buf1[1024]; + size_t len1 = sizeof (buf1); + char *old = asnprintf (buf1, &len1, "%s\"%s\"", directive, value); + if (!old) + xalloc_die (); + char buf2[1024]; + size_t len2 = sizeof (buf2); + char *new = asnprintf (buf2, &len2, "%%define api.prefix {%s}", value); + if (!new) + xalloc_die (); + bison_directive (loc, old); + deprecated_directive (loc, old, new); + if (old != buf1) + free (old); + if (new != buf2) + free (new); +} + + static void do_require (location const *loc, char const *version) { diff --git a/src/scan-gram.l b/src/scan-gram.l index 571962e9..86097b07 100644 --- a/src/scan-gram.l +++ b/src/scan-gram.l @@ -144,7 +144,8 @@ splice (\\[ \f\t\v]*\n)* /* An equal sign, with optional leading whitespaces. This is used in some deprecated constructs. */ -eqopt ([[:space:]]*=)? +sp [[:space:]]* +eqopt ({sp}=)? %% %{ @@ -266,10 +267,7 @@ eqopt ([[:space:]]*=)? /* Deprecated since Bison 2.6 (2012-07-19), but the warning is issued only since Bison 3.3. */ - "%name"[-_]"prefix"{eqopt} { - deprecated_directive (loc, yytext, "%define api.prefix"); - return BISON_DIRECTIVE (NAME_PREFIX); - } + "%name"[-_]"prefix"{eqopt}{sp} RETURN_VALUE (PERCENT_NAME_PREFIX, uniqstr_new (yytext)); /* Deprecated since Bison 2.7.90, 2012. */ "%default"[-_]"prec" DEPRECATED ("%default-prec"); diff --git a/tests/headers.at b/tests/headers.at index bdca60d5..32c8d856 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -85,7 +85,7 @@ exp: %empty; ]]) AT_BISON_CHECK([--defines -o input.c input.y], [], [], -[[input.y:11.1-12: warning: deprecated directive: '%name-prefix', use '%define api.prefix' [-Wdeprecated] +[[input.y:11.1-18: warning: deprecated directive: '%name-prefix "my_"', use '%define api.prefix {my_}' [-Wdeprecated] ]]) # YYLTYPE should be defined, and MY_LLOC declared. diff --git a/tests/input.at b/tests/input.at index 7fdba82f..5d7ea7f6 100644 --- a/tests/input.at +++ b/tests/input.at @@ -2514,7 +2514,7 @@ input.y:13.1-14: warning: deprecated directive: '%file-prefix =', use '%file-pre input.y:14.1-15.2: warning: deprecated directive: '%file-prefix\n =', use '%file-prefix' [-Wdeprecated] input.y:17.1-19: warning: deprecated directive: '%fixed-output_files', use '%fixed-output-files' [-Wdeprecated] input.y:18.1-19: warning: deprecated directive: '%fixed_output-files', use '%fixed-output-files' [-Wdeprecated] -input.y:20.1-13: warning: deprecated directive: '%name-prefix=', use '%define api.prefix' [-Wdeprecated] +input.y:20.1-19: warning: deprecated directive: '%name-prefix= "foo"', use '%define api.prefix {foo}' [-Wdeprecated] input.y:21.1-16: warning: deprecated directive: '%no-default_prec', use '%no-default-prec' [-Wdeprecated] input.y:22.1-16: warning: deprecated directive: '%no_default-prec', use '%no-default-prec' [-Wdeprecated] input.y:23.1-9: warning: deprecated directive: '%no_lines', use '%no-lines' [-Wdeprecated] @@ -2524,7 +2524,7 @@ input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-tabl input.y:27.1-14: warning: deprecated directive: '%error-verbose', use '%define parse.error verbose' [-Wdeprecated] input.y:27-6: error: %define variable 'parse.error' redefined input.y:11-6: previous definition -input.y:29.1-12: warning: deprecated directive: '%name-prefix', use '%define api.prefix' [-Wdeprecated] +input.y:29.1-18: warning: deprecated directive: '%name-prefix "bar"', use '%define api.prefix {bar}' [-Wdeprecated] ]]) AT_CLEANUP