This package contains the GNU Bison parser generator.

# Installation
## Build from git
Here are basic installation instructions for a repository checkout:

    $ git submodule update --init
    $ ./bootstrap

then proceed with the usual `configure && make` steps.

The file README-hacking.md is about building, modifying and checking Bison.

## Build from tarball
See the file INSTALL for generic compilation and installation instructions.

Bison requires GNU m4 1.4.6 or later.  See
https://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz.

## Colored diagnostics
As an experimental feature, diagnostics are now colored, controlled by the
`--color` and `--style` options.

To use them, install the libtextstyle library before configuring Bison.  It
is available from https://alpha.gnu.org/gnu/gettext/, for instance
https://alpha.gnu.org/gnu/gettext/libtextstyle-0.8.tar.gz.

The option --color supports the following arguments:
- always, yes: Enable colors.
- never, no: Disable colors.
- auto, tty (default): Enable colors if the output device is a tty.

To customize the styles, create a CSS file, say `bison-bw.css`, similar to

    /* bison-bw.css */
    .warning   { }
    .error     { font-weight: 800; text-decoration: underline; }
    .note      { }

then invoke bison with `--style=bison-bw.css`, or set the `BISON_STYLE`
environment variable to `bison-bw.css`.

## Relocatability
If you pass `--enable-relocatable` to `configure`, Bison is relocatable.

A relocatable program can be moved or copied to a different location on the
file system.  It can also be used through mount points for network sharing.
It is possible to make symlinks to the installed and moved programs, and
invoke them through the symlink.

See "Enabling Relocatability" in the documentation.

## Internationalization
Bison supports two catalogs: one for Bison itself (i.e., for the
maintainer-side parser generation), and one for the generated parsers (i.e.,
for the user-side parser execution).  The requirements between both differ:
bison needs ngettext, the generated parsers do not.  To simplify the build
system, neither are installed if ngettext is not supported, even if
generated parsers could have been localized.  See
http://lists.gnu.org/archive/html/bug-bison/2009-08/msg00006.html for more
details.

# Questions
See the section FAQ in the documentation (doc/bison.info) for frequently
asked questions.  The documentation is also available in PDF and HTML,
provided you have a recent version of Texinfo installed: run `make pdf` or
`make html`.

If you have questions about using Bison and the documentation does not
answer them, please send mail to <help-bison@gnu.org>.

# Bug reports
Please send bug reports to <bug-bison@gnu.org>.  Be sure to include the
version number from `bison --version`, and a complete, self-contained test
case in each bug report.

# Copyright statements
For any copyright year range specified as YYYY-ZZZZ in this package, note
that the range specifies every single year in that closed interval.

<!--

Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018-2019 Free
Software Foundation, Inc.

This file is part of GNU bison, the GNU Compiler Compiler.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.

Local Variables:
mode: markdown
fill-column: 76
ispell-dictionary: "american"
End:

LocalWords:  parsers ngettext Texinfo pdf html YYYY ZZZZ ispell american
LocalWords:  MERCHANTABILITY

-->
