For an older version of this repository based on sedlex, refer to the sedlex branch.
Writing an OCaml parser with nice error messages should be easy - and now it is! Nice Parser comes in two parts:
- lib/: The
nice_parser
library (API) consolidates boilerplate code and wraps your auto-generated parser in a nice interface with beautiful error messages. In types:Nice_parser.Make : functor(P : RAW_PARSER) -> NICE_PARSER
. - example/: The example parser lets you get started on your own parser in seconds. It is based on
nice_parser
and standard tools:
Using the library and the skeleton, you can get started on your own parser in seconds:
git clone https://github.com/smolkaj/nice-parser.git # clone this repository
cd nice-parser && rm -r lib && mv example src # use example as starting point
opam install . --deps-only --with-test # install dependencies
dune build # try to build...
dune exec src/bin/main.exe # ...and run your parser!
You should see the following output (the error message relies on OCaml >= 4.08's new source highlighting mechanism):
Trying to parse "(a b (c d) e)".
-> (List ((Atom a) (Atom b) (List ((Atom c) (Atom d))) (Atom e)))
Trying to parse "(long_atom_with_0123)".
-> (List ((Atom long_atom_with_0123)))
Trying to parse "
( so far so good
but (this is)) illegal (isnt it?)
(* parsing will fail ^^^^^^^ here *)
".
Fatal error: exception Line 3, characters 25-32:
3 | but (this is)) illegal (isnt it?)
^^^^^^^
Error: [parser] unexpected token
The API is documented here. The example skeleton should be self-explanatory.
Ideally, use OCaml 4.08 or higher (for beautiful error messages). All required dependencies can be installed using the opam package manager. The project can be built using dune.
opam install . --deps-only --with-test
dune build
dune runtest
Suggestions and changes are welcome. Please submit pull requests, or open issues.