From b5b61c616b6a42a9f3a9cc0e9aeaf5124e7cffc5 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 29 Dec 2001 14:27:45 +0000 Subject: [PATCH] %name-prefix is broken. * src/files.c (spec_name_prefix): Initialize to NULL, not to "yy". Adjust all dependencies. * tests/headers.at (export YYLTYPE): Strengthen this test: use %name-prefix. Renaming yylval but not yylloc is not consistent. Now we do. * src/bison.simple: Prefix yylloc if used. * doc/bison.texinfo (Decl Summary): Document that. --- ChangeLog | 15 +++++++++++++++ doc/bison.texinfo | 8 ++++---- src/bison.simple | 6 +++++- src/files.c | 9 ++++++++- src/output.c | 9 +++++---- tests/headers.at | 16 +++++++++------- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 01e0d27c..a2acb31c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2001-12-29 Akim Demaille + + %name-prefix is broken. + + * src/files.c (spec_name_prefix): Initialize to NULL, not to "yy". + Adjust all dependencies. + * tests/headers.at (export YYLTYPE): Strengthen this test: use + %name-prefix. + + Renaming yylval but not yylloc is not consistent. Now we do. + + * src/bison.simple: Prefix yylloc if used. + * doc/bison.texinfo (Decl Summary): Document that. + + 2001-12-29 Akim Demaille * doc/bison.texinfo: Promote `%long-directive' over diff --git a/doc/bison.texinfo b/doc/bison.texinfo index eb722d38..f4360cd3 100644 --- a/doc/bison.texinfo +++ b/doc/bison.texinfo @@ -3289,10 +3289,10 @@ accurate parse error messages. Rename the external symbols used in the parser so that they start with @var{prefix} instead of @samp{yy}. The precise list of symbols renamed is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs}, -@code{yylval}, @code{yychar} and @code{yydebug}. For example, if you -use @samp{%name-prefix="c_"}, the names become @code{c_parse}, -@code{c_lex}, and so on. @xref{Multiple Parsers, ,Multiple Parsers in -the Same Program}. +@code{yylval}, @code{yychar}, @code{yydebug}, and possible +@code{yylloc}. For example, if you use @samp{%name-prefix="c_"}, the +names become @code{c_parse}, @code{c_lex}, and so on. @xref{Multiple +Parsers, ,Multiple Parsers in the Same Program}. @item %no-parser Do not include any C code in the parser file; generate tables only. The diff --git a/src/bison.simple b/src/bison.simple index 3c58fc92..57190178 100644 --- a/src/bison.simple +++ b/src/bison.simple @@ -40,7 +40,7 @@ /* Using locations. */ #define YYLSP_NEEDED %%locations-flag -/* If name_prefix is specify substitute the variables and functions +/* If NAME_PREFIX is specified substitute the variables and functions names. */ #define yyparse %%prefix##parse #define yylex %%prefix##lex @@ -49,6 +49,10 @@ #define yychar %%prefix##char #define yydebug %%prefix##debug #define yynerrs %%prefix##nerrs +#if YYLSP_NEEDED +# define yylloc %%prefix##lloc +#endif + /* Copy the user declarations. */ %%prologue diff --git a/src/files.c b/src/files.c index 0b958c1a..dc886a0b 100644 --- a/src/files.c +++ b/src/files.c @@ -32,9 +32,16 @@ struct obstack action_obstack; struct obstack attrs_obstack; struct obstack output_obstack; +/* Initializing some values below (such SPEC_NAME_PREFIX to `yy') is + tempting, but don't do that: for the time being our handling of the + %directive vs --option leaves precedence to the options by deciding + that if a %directive sets a variable which is really set (i.e., not + NULL), then the %directive is ignored. As a result, %name-prefix, + for instance, will not be honored. */ + char *spec_outfile = NULL; /* for -o. */ char *spec_file_prefix = NULL; /* for -b. */ -const char *spec_name_prefix = "yy"; /* for -p. */ +const char *spec_name_prefix = NULL; /* for -p. */ char *spec_verbose_file = NULL; /* for --verbose. */ char *spec_graph_file = NULL; /* for -g. */ char *spec_defines_file = NULL; /* for --defines. */ diff --git a/src/output.c b/src/output.c index 4b1f999e..34d6b06a 100644 --- a/src/output.c +++ b/src/output.c @@ -1075,7 +1075,8 @@ output_master_parser (void) #define MUSCLE_INSERT_PREFIX(Key, Value) \ { \ - obstack_fgrow2 (&muscle_obstack, "%s%s", spec_name_prefix, Value); \ + obstack_fgrow2 (&muscle_obstack, "%s%s", \ + spec_name_prefix ? spec_name_prefix : "yy", Value); \ obstack_1grow (&muscle_obstack, 0); \ muscle_insert (Key, obstack_finish (&muscle_obstack)); \ } @@ -1091,7 +1092,7 @@ prepare (void) MUSCLE_INSERT_INT ("final", final_state); MUSCLE_INSERT_INT ("maxtok", max_user_token_number); MUSCLE_INSERT_INT ("error-verbose", error_verbose); - MUSCLE_INSERT_STRING ("prefix", spec_name_prefix); + MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); MUSCLE_INSERT_INT ("nnts", nvars); MUSCLE_INSERT_INT ("nrules", nrules); @@ -1127,7 +1128,7 @@ yystype;\n\ if (!pure_parser) fprintf (out, "\nextern YYSTYPE %slval;\n", - spec_name_prefix); + spec_name_prefix ? spec_name_prefix : "yy"); if (locations_flag) { @@ -1145,7 +1146,7 @@ typedef struct yyltype\n\ #endif\n"); if (!pure_parser) fprintf (out, "\nextern YYLTYPE %slloc;\n", - spec_name_prefix); + spec_name_prefix ? spec_name_prefix : "yy"); } if (semantic_parser) diff --git a/tests/headers.at b/tests/headers.at index 5e2facb4..3f8ea961 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -82,18 +82,20 @@ AT_SETUP([export YYLTYPE]) AT_DATA([input.y], [%locations + +%name-prefix="my_" %{ #include #include static int -yylex (void) +my_lex (void) { return EOF; } static void -yyerror (const char *msg) +my_error (const char *msg) { fprintf (stderr, "%s\n", msg); } @@ -105,22 +107,22 @@ exp:; AT_CHECK([bison --defines input.y -o input.c]) -# YYLTYPE should be defined, and YYLLOC declared. +# YYLTYPE should be defined, and MY_LLOC declared. AT_DATA([caller.c], [[#include "input.h" -YYLTYPE *yyllocp = &yylloc; +YYLTYPE *my_llocp = &my_lloc; -int yyparse (void); +int my_parse (void); int main (void) { - return yyparse (); + return my_parse (); } ]]) # Link and execute, just to make sure everything is fine (and in -# particular, that YYLLOC is indeed defined somewhere). +# particular, that MY_LLOC is indeed defined somewhere). AT_CHECK([$CC $CFLAGS $CPPFLAGS caller.c input.c -o caller], 0, [], [ignore]) AT_CHECK([caller]) -- 2.45.2