1.0.0-alpha.1 • Published 6 years ago

myntax v1.0.0-alpha.1

Weekly downloads
6
License
-
Repository
-
Last release
6 years ago

Myntax

A parser, converter, and pretty-printer generator for OCaml.

Based on https://rwmj.wordpress.com/2010/12/29/packrat-parser-with-left-recursion/, with heavy modifications.

Lisp.re

Building & using the lisp-to-ocaml parser

  • clone this repo
  • npm install
  • npm run build
  • ./lib/bs/native/lisp.native ml some-file.rel will print out the lisp.re file converted to ocaml syntax
  • ./lib/bs/native/lisp.native bin some-file.rel > some-file.ast will act as a -pp, it will output the binary representation of the ocaml AST to standard out (here redirected into a file). You can then compile it like ocamlc -impl some-file.ast.

Using Lisp.re in a real project

The ocaml compiler actually makes this super easy :D.

watch.js is a script that, when run with a directory, will watch the .rel files in that directory, and recompile them when they change, piping the binary output into the equivalent .ml file. You can then have bucklescript watching the directory, or jbuilder running, and they will treat the binary .ml file as a perfectly normal source file.

npm run example will start the watcher for example/src. You can then start bsb in the example directory with cd example && npm start, and edit example/src/Hello.rel and see bsb recompile.

TODO

Parsing

  • better error messages! I think I can add nice messages to a given rule item, detailing what the correct syntax should be. Like "in a record declaration, you can only do :keyword and :keyword int". Although maybe I can do that automatically? That would be super cool. Also I could generate "examples" automatically via the pretty printer. Would want to generate "minimally interesting" examples, that followed the longest branch that we were on.

Pretty-printing

  • preserving newlines between forms would be nice
  • preserve comments pls
  • I want to be able to represent the "fill box" from Format. Also specify indentation groups, etc.