I'm trying to use two parsers in the same program to parse different
grammars.  The %name-prefix declaration works fine for as far as it goes.

However, I'm also using

        #define YYDEBUG 1
        %pure-parser
        %lex-param {LPPLLOCALVARS lpplLocalVars}
        %parse-param {LPPLLOCALVARS lpplLocalVars}

as well as function prototypes which complicates the picture.

Each source file (including the .c files generated from the .y files)
has its own separate file with an extension of .pro which consists of
the compiler's output from generating the source file's prototypes.
For example, one of the generated .pro files has an entry for

extern int __cdecl fh_yyparse(void );

while the other has

extern int __cdecl pl_yyparse(void );

corresponding to %name-prefix="fh_yy" and %name-prefix="pl_yy"
respectively in the two source files.  All of the prototype files are
#included in one header file and that file is #included in every
source file (with appropriate #ifdefs around it for when the
prototypes are being generated).

Thus, there is a file called "compro.h" which has a line for each
prototype file such as

...
#include "fnhdr.pro"
...
#include "parseline.pro"
...

and all source files (such as fnhdr.y/.c and parseline.y/.c) have

#include "compro.h"

The problem occurs with the following four function names not subject
to %name-prefix:  yy_symbol_value_print, yy_symbol_print,
yy_reduce_print, and yydestruct.  In one file I use %lex-param {...}
which defines parameters to yylex, and yyparse, but also passes those
parameters to each of the above four functions.

Thus, there is a conflict between the two occurrences of (say)
yydestruct because they have different prototypes.  That is, in one
prototype file, yydestruct is declared as

static void __cdecl yydestruct(const char *yymsg,int yytype,struct
tagYYSTYPE *yyvaluep,struct tagPLLOCALVARS *lpplLocalVars);

and in the other it is declared with the last struct omitted because
that file doesn't use %lex-param (the error msg is "warning:  second
formal parameter list longer than the first list").

Eventually, I figured out that I can work around this problem using

#define yy_symbol_print         fh_yy_symbol_print
#define yy_symbol_value_print   fh_yy_symbol_value_print
#define yy_reduce_print         fh_yy_reduce_print
#define yydestruct              fh_yydestruct

however, wouldn't it be a better idea if %name-prefix changed those four names as well?
--
_______________________________________________________________
Bob Smith - [EMAIL PROTECTED] - http://www.sudleyplace.com


_______________________________________________
help-bison@gnu.org http://lists.gnu.org/mailman/listinfo/help-bison

Reply via email to