ReScript's syntax as a standalone repo.
This repo is the source of truth for the ReScript parser & printer. Issues go here.
You don't need this repo to use the ReScript syntax. This comes with ReScript >=8.1. This repo is for syntax developers.
A detailed discussion by Jonathan Blow and Casey Muratori on why you would hand-roll a parser for a production quality programming language Discussion: Making Programming Language Parsers, etc
"One reason why I switched off these parser tools is that the promises didn't really materialize. The amount of work that I had to do change a yacc script from one language to a variant of that language was more than if I hand wrote the code myself. " J. Blow.
Required: - NodeJS - Ocaml 4.06.1 - OS: Mac
opam switch create 4.06.1 && eval $(opam env) git clone https://github.com/rescript-lang/syntax.git cd syntax npm install make # or: make -j9 for faster build
This will produce the final binary
lib/rescript.exeused for testing.
First build is super slow because we're also building our vendored
refmt(only used for the conversion tool). Subsequent builds should be <2s. If not, please file an issue (build speed is a priority).
We only build production binary, even in dev mode. No need for a separate dev binary when the build is fast enough. Plus, this encourages proper benchmarking of the (production) binary each diff.
After you make a change:
Run the core tests:
sh make test
Run the extended tests:
sh make roundtrip-test
Those will tell you whether you've got a test output difference. If it's intentional, check them in.
Debug a file: ```sh
./lib/rescript.exe test.res # test printer ./lib/rescript.exe -print ast test.res # print ast ./lib/rescript.exe -print ml test.res # show ocaml code ./lib/rescript.exe -print res -width 80 test.res # test printer and change default print width ```
sh make bench
Enable stack trace: ```sh
export OCAMLRUNPARAM="b" ```
This is likely a known knowledge: add the above line into your shell rc file so that every shell startup you have OCaml stack trace enabled.
src/syntaxcontains all the source code. Don't change folder structure without notice; ReScript uses this repo as a submodule and assumes
Right now, ReScript's compiler's error reporting mechanism, for architectural reasons, is independent from this syntax repo's error reporting mechanism. However, we do want a unified look when they report the errors in the terminal. This is currently achieved by (carefully...) duplicating the error report logic from the compiler repo to here (or vice-versa; either way, just keep them in sync). The files to sync are the compiler repo's super_location.ml and supercodeframe.ml, into this repo's resdiagnosticsprinting_utils.ml. A few notes:
In a random project of yours:
node_modules/.bin/bsrefmt --print=binary myFile.re | your/path/to/rescript.exe -parse reasonBinary -print ns > myFile.res node_modules/.bin/bsrefmt --print=binary --interface=true myFile.rei | your/path/to/rescript.exe -parse reasonBinary -print ns -interface > myFile.resi mv myFile.re myFile.re.backup # random backup name. Could be anything
module Parser = ResCore.Parser module Diagnostics = ResCore.Diagnostics
let filename = "foo.res" let src = FS.readFile filename
let p = (* intended for ocaml compiler ) let mode = Parser.ParseForTypeChecker in ( if you want to target the printer use: let mode = Parser.Default in*) Parser.make ~mode src filename
let structure = ResParser.parseImplementation p let signature = ResParser.parseInterface p
let () = match p.Parser.diagnostics with |  -> () (* no problems ) | diagnostics -> ( parser contains problems *) prerr_string ( Diagnostics.stringOfReport ~style:Diagnostics.Pretty diagnostics src )