List Info

Thread: Name Conflict With Multiple Parsers In Same Program




Name Conflict With Multiple Parsers In Same Program
user name
2007-06-11 19:17:54
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 - bsmithsudleyplace.com - http://www.sudleyplace.com



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

Re: Name Conflict With Multiple Parsers In Same Program
country flaguser name
Sweden
2007-06-12 08:38:06
On 12 Jun 2007, at 02:17, Bob Smith wrote:

> I'm trying to use two parsers in the same program to
parse different
> grammars.
...
> 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.

It seems like a bug: report it to Bison Bugs
<bug-bisongnu.org>.

In the meantime, you can tweak the skeleton file. Compare
those names  
with those that properly get the "yy" prefix
changed.

   Hans Aberg




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

[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )