The BNF Converter (bnfc) is a compiler construction tool generating a compiler front-end from a Labelled BNF (LBNF) grammar. It is currently able to generate Haskell, Agda, C, C++, Java, and OCaml, as well as XML representations.
Given a LBNF grammar the tool produces:
More information: http://bnfc.digitalgrammars.com/
Some binaries are available at https://github.com/BNFC/bnfc/releases.
Installation from the Haskell sources is possible via stack
or cabal
.
You need a running installation of stack. To install and run the latest version of bnfc from stackage, enter at the command line:
stack install BNFC
bnfc --help
BNFC versions in major Stackage LTS snapshots:
GHC | LTS | BNFC |
---|---|---|
8.8.4 | 16.31 | 2.8.4 |
8.10.7 | 18.28 | 2.9.4 |
9.0.2 | 19.33 | 2.9.4 |
9.2.8 | 20.26 | 2.9.4.1 |
9.4.8 | 21.25 | 2.9.5 |
You need a running installation of a recent version of GHC and Cabal, most easily available via the GHCup. To install bnfc from hackage, enter at the command line:
cabal install BNFC
bnfc --help
To install the development version of bnfc with the latest bugfixes (and regressions ;-)):
git clone https://github.com/BNFC/bnfc.git
cd bnfc/source
and then either
cabal install
or
stack install --stack-yaml stack-9.4.yaml
(replace 9.4
with your GHC major version, and if you want to build with
your installed GHC then add flag --system-ghc
).
Build a first parser in 5 min (Haskell backend):
In a fresh directory, prepare a grammar file Sum.cf
with the following content:
EInt. Exp ::= Integer;
EPlus. Exp ::= Exp "+" Integer;
Build a parser (in Haskell) with bnfc:
bnfc -d -m Sum.cf && make
The make
step needs the Haskell compiler GHC, the lexer
generator alex and the parser generator happy (all included in the GHC installation).
Inspect the generated files in directory Sum
.
Test the parser.
echo "1 + 2 + 3" | Sum/Test
Try the C-family backends. (The prerequisites, GNU C(++) compiler
(gcc
/ g++
), lexer generator flex
and parser generator bison
,
are usually present):
bnfc --c -m -o sum-c Sum.cf && make -C sum-c && echo "1 + 2 + 3" | sum-c/TestSum
bnfc --cpp -m -o sum-cpp Sum.cf && make -C sum-cpp && echo "1 + 2 + 3" | sum-cpp/TestSum
Try the other backends:
Option | Backend |
---|---|
--java |
Requires Java, JLex or JFlex, and CUP. |
--java-antlr |
Requires ANTLR. |
--ocaml |
Requires OCaml, ocamllex and ocamlyacc . |
--ocaml-menhir |
Uses menhir instead of ocamlyacc . |
--agda |
Produces Agda bindings to the parser generated for Haskell. |
--pygments |
Produces a lexer definition for the Python highlighting suite Pygments. |
https://bnfc.readthedocs.org/en/latest/
You can discuss with us issues around bnfc on our mailing list bnfc-dev@googlegroups.com.
For current limitations of bnfc, or to report a new bug, please consult our issue tracker.
The project is licensed under the BSD 3-clause license.
BNFC versions until 2.8.4 released under the GNU General Public License.
In research:
In teaching: