Re: api.header.include and backward-compatible .y files

Kaz Kylheku <[email protected]>
Newsgroups gmane.comp.parsers.bison.bugs
Message-ID <[email protected]>
On 2020-08-21 17:33, Adam Novak wrote:
> Hello,
> 
> I'm maintaining a .y file at
> https://github.com/vgteam/raptor/blob/master/src/turtle_parser.y that
> needs to be backward-compatible with the Bison available in Ubuntu
> 18.04 (3.0.4), but also work on the latest Bison that our project's
> Mac users get supplied from Homebrew (3.7.1).
> The recent change that made api.header.include actually work seems to
> make that difficult:
> 
> 2020-06-09  Akim Demaille  <[email protected]>
> 
>         api.header.include: document it, and fix its default value
>         While defining api.header.include worked as expected, its 
> default
>         value was incorrectly defined.  As a result, by default, the 
> generated
>         parsers still duplicated the content of the generated header 
> instead
>         of including it.
> 
> The build system I am working with generates .tab.c and .tab.h files,
> and then moves them around so they become plain .c and .h files.

There are just two wrongs here: you and Bison. I'm leaning toward
less you and more Bison.

The "-b" option of Yacc is specified by POSIX. The .tab.c and .tab.h
convention is hard-coded. POSIX doesn't explicitly state that you can
just rename the files yourself and they still work. So you are skirting
trouble by doing that.

That said, Bison did a bad thing here. You see, POSIX requires y.tab.c 
to
duplicate y.tab.h. That's why the skeleton was doing it.

Here is the wording from POSIX about y.tab.c:

    "It also shall contain a copy of the #define statements in
    the header file."

Now if that is the case, there is no reason for y.tab.c to include
y.tab.h, which has the interpretation that you can rename it to whatever
you want!

Bison's change to reference the header file via #include is actually
a nonconformance which breaks programs that rename the header.

I see this in a 3.0.4 generated file:

   /* In a future release of Bison, this section will be replaced
      by #include "y.tab.h".  */
   #ifndef YY_YY_Y_TAB_H_INCLUDED

I.e. "a future release of Bison will raise a middle finger to
IEEE 1003.1 which requires the following section ...".

Your parser is obviously using so many extensions that we might
be tempted to say that POSIX is irrelevant; yet it's obviously
relevant because you would still have this issue with the header
file even if you were using Bison as nothing more than a yacc
implementation.

Anyway, though, try just not renaming the files and living
with the .tab. infix. It's a nice convention. When any "Yacc
person" sees those files, they know what they are.

The way Bison is maintained, it is such a moving target, that
the the best thing to do may be to insist on a particular version of
Bison for building your program. And since downstream distros that
pick up your project, as well as regular users, will certainly not
have that version of Bison, what you have to do is include the
generated Bison code in your project, checked into your Git repo,
and redistributed along with your source.

This way only someone who wants to be a contributor
(specifically, a contributor who wants to modify your .y files)
has to then get that required version of Bison to rebuild the
parsers.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.