Skip to content
Nice parsers in OCaml without the boilerplate
OCaml Shell Makefile
Branch: master
Clone or download
Latest commit b436ff4 Aug 9, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
ci Update Aug 9, 2019
example Complete revamp Jul 27, 2019
lib some tweaks to README, travis, and dependencies Jul 28, 2019
.gitignore Complete revamp Jul 27, 2019
.travis.yml also test on MacOS Aug 2, 2019 Complete revamp Jul 27, 2019
LICENSE Complete revamp Jul 27, 2019
Makefile Complete revamp Jul 27, 2019 fix Makefile Aug 2, 2019
dune-project Rename repo: "ocaml-parsing" -> "nice-parser". Aug 2, 2019
nice_parser.opam Rename repo: "ocaml-parsing" -> "nice-parser". Aug 2, 2019

For an older version of this repository based on sedlex, refer to the sedlex branch.

Nice Parser Build Status

Writing an OCaml parser with nice error messages should be easy - and now it is! Nice Parser comes in two parts:

  1. 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.
  2. example/: The example parser lets you get started on your own parser in seconds. It is based on nice_parser and standard tools:
    • Menhir, a LR(1) parser generator.
    • ocamllex, OCaml's built-in lexer generator.
    • Jane Street's dune and base, the de-facto standard built tool and standard library for OCaml.

Using the library and the skeleton, you can get started on your own parser in seconds:

opam install nice_parser                                # install the nice_parser library
git clone    # clone this repository
cd nice-parser && rm -r lib && mv example src           # use example as starting point
dune build src/example.a                                # 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.

How to build

Ideally, use OCaml 4.08 or higher (for beautiful error messages). The project can be built using dune. Consult the dune-project file for the necessary dependencies; all of them can be installed using the opam packet manager.

Suggestions and Improvements

Suggestions and changes are welcome. Please submit pull requests, or open issues.

You can’t perform that action at this time.