Skip to content
This repository was archived by the owner on Jun 15, 2023. It is now read-only.

Commit 1565905

Browse files
committed
Open source
0 parents  commit 1565905

File tree

1,617 files changed

+718432
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,617 files changed

+718432
-0
lines changed

.depend

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
src/napkin_ast_conversion.cmx : src/napkin_ast_conversion.cmi
2+
src/napkin_ast_conversion.cmi :
3+
src/napkin_ast_debugger.cmx : src/napkin_driver.cmx src/napkin_doc.cmx \
4+
src/napkin_ast_debugger.cmi
5+
src/napkin_ast_debugger.cmi : src/napkin_driver.cmi
6+
src/napkin_binary_driver.cmx : src/napkin_driver.cmx \
7+
src/napkin_binary_driver.cmi
8+
src/napkin_binary_driver.cmi : src/napkin_driver.cmi
9+
src/napkin_character_codes.cmx :
10+
src/napkin_comment.cmx : src/napkin_comment.cmi
11+
src/napkin_comment.cmi :
12+
src/napkin_comments_table.cmx : src/napkin_doc.cmx src/napkin_comment.cmx
13+
src/napkin_core.cmx : src/napkin_token.cmx src/napkin_scanner.cmx \
14+
src/napkin_printer.cmx src/napkin_parser.cmx src/napkin_js_ffi.cmx \
15+
src/napkin_grammar.cmx src/napkin_doc.cmx src/napkin_diagnostics.cmx \
16+
src/napkin_comments_table.cmx src/napkin_core.cmi
17+
src/napkin_core.cmi : src/napkin_parser.cmi
18+
src/napkin_diagnostics.cmx : src/napkin_token.cmx src/napkin_reporting.cmx \
19+
src/napkin_grammar.cmx src/napkin_diagnostics.cmi
20+
src/napkin_diagnostics.cmi : src/napkin_token.cmx src/napkin_grammar.cmx
21+
src/napkin_doc.cmx : src/napkin_minibuffer.cmx src/napkin_doc.cmi
22+
src/napkin_doc.cmi :
23+
src/napkin_driver.cmx : src/napkin_printer.cmx src/napkin_parser.cmx \
24+
src/napkin_diagnostics.cmx src/napkin_core.cmx src/napkin_comment.cmx \
25+
src/napkin_driver.cmi
26+
src/napkin_driver.cmi : src/napkin_diagnostics.cmi src/napkin_comment.cmi
27+
src/napkin_grammar.cmx : src/napkin_token.cmx
28+
src/napkin_js_ffi.cmx :
29+
src/napkin_main.cmx : src/napkin_reason_binary_driver.cmx \
30+
src/napkin_ml_parser_driver.cmx src/napkin_driver.cmx \
31+
src/napkin_binary_driver.cmx src/napkin_ast_debugger.cmx
32+
src/napkin_minibuffer.cmx : src/napkin_minibuffer.cmi
33+
src/napkin_minibuffer.cmi :
34+
src/napkin_ml_parser_driver.cmx : src/napkin_driver.cmx \
35+
src/napkin_comment.cmx src/napkin_ast_conversion.cmx \
36+
src/napkin_ml_parser_driver.cmi
37+
src/napkin_ml_parser_driver.cmi : src/napkin_driver.cmi \
38+
src/napkin_comment.cmi
39+
src/napkin_outcome_printer.cmx : src/napkin_doc.cmx \
40+
src/napkin_outcome_printer.cmi
41+
src/napkin_outcome_printer.cmi :
42+
src/napkin_parens.cmx : src/napkin_parsetree_viewer.cmx \
43+
src/napkin_parens.cmi
44+
src/napkin_parens.cmi :
45+
src/napkin_parser.cmx : src/napkin_token.cmx src/napkin_scanner.cmx \
46+
src/napkin_reporting.cmx src/napkin_grammar.cmx \
47+
src/napkin_diagnostics.cmx src/napkin_comment.cmx src/napkin_parser.cmi
48+
src/napkin_parser.cmi : src/napkin_token.cmx src/napkin_scanner.cmi \
49+
src/napkin_reporting.cmx src/napkin_grammar.cmx \
50+
src/napkin_diagnostics.cmi src/napkin_comment.cmi
51+
src/napkin_parsetree_viewer.cmx : src/napkin_parsetree_viewer.cmi
52+
src/napkin_parsetree_viewer.cmi :
53+
src/napkin_printer.cmx : src/napkin_token.cmx \
54+
src/napkin_parsetree_viewer.cmx src/napkin_parens.cmx src/napkin_doc.cmx \
55+
src/napkin_comments_table.cmx src/napkin_comment.cmx \
56+
src/napkin_printer.cmi
57+
src/napkin_printer.cmi : src/napkin_doc.cmi src/napkin_comments_table.cmx \
58+
src/napkin_comment.cmi
59+
src/napkin_reason_binary_driver.cmx : src/napkin_scanner.cmx \
60+
src/napkin_driver.cmx src/napkin_comment.cmx \
61+
src/napkin_ast_conversion.cmx src/napkin_reason_binary_driver.cmi
62+
src/napkin_reason_binary_driver.cmi : src/napkin_token.cmx \
63+
src/napkin_driver.cmi src/napkin_comment.cmi
64+
src/napkin_reporting.cmx : src/napkin_token.cmx src/napkin_grammar.cmx
65+
src/napkin_scanner.cmx : src/napkin_token.cmx src/napkin_diagnostics.cmx \
66+
src/napkin_comment.cmx src/napkin_character_codes.cmx \
67+
src/napkin_scanner.cmi
68+
src/napkin_scanner.cmi : src/napkin_token.cmx src/napkin_diagnostics.cmi
69+
src/napkin_token.cmx : src/napkin_comment.cmx src/napkin_character_codes.cmx

.gitignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
.DS_STORE
2+
_build
3+
_esy
4+
esy.lock
5+
node_modules
6+
*.cm*
7+
*.o
8+
lib/napkinscript.exe
9+
lib/refmt.exe
10+
lib/bench.exe
11+
Napkinscript2.ml
12+
./lib/napkinscript2.exe
13+
./lib/Napkinscript.ml
14+
lib/napkinscript.ml

.merlin

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
S src
2+
B src
3+
S +compiler-libs
4+
B +compiler-libs
5+
6+
FLG -w +6+26+27+32+33+39
7+
8+
####{BSB GENERATED: NO EDIT
9+
FLG -ppx '/Users/chenglou/github/syntax/node_modules/bs-platform/darwin/bsc.exe -as-ppx '
10+
S /Users/chenglou/github/syntax/node_modules/bs-platform/lib/ocaml
11+
B /Users/chenglou/github/syntax/node_modules/bs-platform/lib/ocaml
12+
FLG -w +a-4-9-20-40-41-42-50-61-102
13+
S src/406
14+
B lib/bs/src/406
15+
####BSB GENERATED: NO EDIT}

.travis.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
language: node_js
2+
3+
node_js:
4+
- 10.15.1
5+
6+
sudo: required
7+
8+
env:
9+
- OCAML_VERSION=4.06
10+
11+
install: test -e .travis.opam.sh || wget https://raw.githubusercontent.com/ocaml/ocaml-ci-scripts/master/.travis-opam.sh
12+
13+
script:
14+
- bash -ex .travis-opam.sh
15+
- npm install
16+
- opam switch create 4.06.1
17+
- eval $(opam env)
18+
- ocamlopt -v
19+
- make world
20+
- make test
21+
22+
os:
23+
# - linux
24+
- osx

Makefile

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
OCAMLC=ocamlc.opt
2+
OCAMLOPT=ocamlopt.opt
3+
OCAMLFLAGS= -w +a-4-42-40-9-48 -warn-error +a -bin-annot -I +compiler-libs -I src
4+
OCAMLDEP=ocamldep.opt
5+
%.cmi : %.mli
6+
$(OCAMLOPT) $(OCAMLFLAGS) -c $<
7+
%.cmx : %.ml
8+
$(OCAMLOPT) $(OCAMLFLAGS) -c $<
9+
include .depend
10+
.PHONY: depend
11+
depend:
12+
$(OCAMLDEP) -native -I src src/*.ml src/*.mli > .depend
13+
14+
FILES = \
15+
src/napkin_minibuffer.cmx\
16+
src/napkin_doc.cmx\
17+
src/napkin_character_codes.cmx\
18+
src/napkin_comment.cmx\
19+
src/napkin_token.cmx\
20+
src/napkin_grammar.cmx\
21+
src/napkin_reporting.cmx\
22+
src/napkin_diagnostics.cmx\
23+
src/napkin_parsetree_viewer.cmx\
24+
src/napkin_parens.cmx\
25+
src/napkin_comments_table.cmx\
26+
src/napkin_printer.cmx\
27+
src/napkin_scanner.cmx\
28+
src/napkin_js_ffi.cmx\
29+
src/napkin_parser.cmx\
30+
src/napkin_core.cmx\
31+
src/napkin_driver.cmx \
32+
src/napkin_ast_conversion.cmx \
33+
src/napkin_ml_parser_driver.cmx \
34+
src/napkin_reason_binary_driver.cmx \
35+
src/napkin_binary_driver.cmx \
36+
src/napkin_ast_debugger.cmx \
37+
src/napkin_outcome_printer.cmx
38+
39+
.DEFAULT_GOAL := build-native
40+
build-native: lib/refmt.exe $(FILES) src/napkin_main.cmx
41+
$(OCAMLOPT) $(OCAMLFLAGS) -O2 -o ./lib/napkinscript.exe -I +compiler-libs ocamlcommon.cmxa -I src $(FILES) src/napkin_main.cmx
42+
43+
bootstrap: build-native
44+
ocaml unix.cma ./scripts/bspack.ml -bs-main Napkin_main -I src -o ./lib/napkinscript.ml
45+
./lib/napkinscript.exe -parse ml -print ns ./lib/Napkinscript.ml > ./lib/Napkinscript2.ml
46+
$(OCAMLOPT) -w a -pp "./lib/napkinscript.exe" -O2 -o ./lib/napkinscript2.exe -I +compiler-libs ocamlcommon.cmxa -I lib ./lib/Napkinscript2.ml
47+
mv ./lib/napkinscript2.exe ./lib/napkinscript.exe
48+
49+
lib/refmt.exe: vendor/refmt_main3.ml
50+
$(OCAMLOPT) -O2 -I vendor -I +compiler-libs ocamlcommon.cmxa -o lib/refmt.exe vendor/refmt_main3.ml
51+
52+
53+
bench: lib/bench.exe
54+
./lib/bench.exe
55+
56+
lib/bench.exe: benchmarks/refmt_main3b.cmx benchmarks/Benchmark.ml $(FILES)
57+
$(OCAMLOPT) $(OCAMLFLAGS) -O2 -o ./lib/bench.exe -bin-annot -I +compiler-libs ocamlcommon.cmxa benchmarks/mac_osx_time.c -I benchmarks -I src $(FILES) benchmarks/refmt_main3b.cmx benchmarks/Benchmark.ml
58+
59+
benchmarks/refmt_main3b.cmx: benchmarks/refmt_main3b.ml
60+
$(OCAMLOPT) -c -O2 -I +compiler-libs ocamlcommon.cmxa benchmarks/refmt_main3b.ml
61+
62+
test: build-native
63+
./node_modules/.bin/jest
64+
./node_modules/.bin/reanalyze -all-cmt ./src
65+
66+
roundtrip-test: bootstrap
67+
ROUNDTRIP_TEST=1 ./node_modules/.bin/jest
68+
./node_modules/.bin/reanalyze -all-cmt ./Napkinscript.cmt
69+
70+
termination:
71+
./node_modules/.bin/reanalyze -termination-cmt ./src
72+
73+
dce:
74+
./node_modules/.bin/reanalyze -dce-cmt ./src
75+
76+
exception:
77+
./node_modules/.bin/reanalyze -exception-cmt ./src
78+
79+
reanalyze:
80+
./node_modules/.bin/reanalyze -all-cmt ./src
81+
82+
clean:
83+
rm -rf src/*.cm*
84+
rm -rf src/*.o
85+
rm -rf benchmarks/*.cm*
86+
rm -rf benchmarks/*.o
87+
rm -rf lib/bench.exe
88+
rm -rf lib/napkinscript.exe
89+
git clean -dfx src
90+
.PHONY: clean test roundtrip-test termination dce exception reanalyze bootstrap build build-native

README.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# BuckleScript New Syntax
2+
3+
Blog post: https://reasonml.org/blog/bucklescript-8-1-new-syntax
4+
5+
Documentation: https://reasonml.org/docs/reason-compiler/latest/new-bucklescript-syntax
6+
7+
This repo is the source of truth for the new BuckleScript parser & printer. Issues go here.
8+
9+
**You don't need this repo to use the new syntax**. This comes with BuckleScript 8.1. This repo is for syntax contributors.
10+
11+
## Contribute
12+
13+
### Why
14+
A detailed discussion by Jonathan Blow and Casey Muratori on why you would hand-roll a parser for a production quality programming language
15+
[Discussion: Making Programming Language Parsers, etc](https://youtu.be/MnctEW1oL-E)
16+
17+
"One reason why I switched off these parser tools is that the promises didn't really materialize.
18+
The amount of work that I had to do change a yacc script from one language to a variant of that language
19+
was more than if I hand wrote the code myself.
20+
"
21+
J. Blow.
22+
23+
### Setup & Usage
24+
25+
Currently for devs only.
26+
27+
Required:
28+
- [NodeJS](https://nodejs.org/)
29+
- Ocaml 4.06.1
30+
- OS: Mac
31+
32+
```sh
33+
opam switch create 4.06.1 && eval $(opam env)
34+
git clone https://github.com/bucklescript/syntax.git
35+
cd syntax
36+
npm install
37+
make # or: make -j9 for faster build
38+
```
39+
40+
This will produce the final binary `lib/napkinscript.exe`. "NapkinScript" is the placeholder name for the syntax. We'll change this later to avoid confusion.
41+
42+
First build is super slow because we're also building our vendored `refmt` (only used for the conversion tool). Subsequent builds should be <1s. If not, please file an issue (build speed is a priority).
43+
44+
Production build (for benchmarking):
45+
46+
```
47+
make build-native
48+
```
49+
50+
Run the core tests:
51+
```
52+
make test
53+
```
54+
55+
Run the extended tests:
56+
```
57+
make roundtrip-test
58+
```
59+
60+
Debug a file:
61+
```
62+
# write code in test.js
63+
make build # build bytecode for fast dev iteration
64+
./lib/napkinscript.exe -print ns test.js # test printer
65+
./lib/napkinscript.exe -print ast test.js # print ast
66+
./lib/napkinscript.exe -print ml test.js # show ocaml code
67+
./lib/napkinscript.exe -print ns -width 80 test.js # test printer and change default print width
68+
```
69+
70+
Benchmark:
71+
```
72+
make bench
73+
```
74+
75+
### Example File Conversion
76+
77+
In a random project of yours:
78+
79+
```sh
80+
node_modules/.bin/bsrefmt --print=binary myFile.re | your/path/to/napkinscript.exe -parse reasonBinary -print ns > myFile.res
81+
node_modules/.bin/bsrefmt --print=binary --interface=true myFile.rei | your/path/to/napkinscript.exe -parse reasonBinary -print ns -interface > myFile.resi
82+
mv myFile.re myFile.re.backup # random backup name. Could be anything
83+
```
84+
85+
### Example API usage
86+
87+
```
88+
module Parser = NapkinscriptCore.Parser
89+
module Diagnostics = NapkinscriptCore.Diagnostics
90+
91+
let filename = "foo.res"
92+
let src = FS.readFile filename
93+
94+
let p =
95+
(* intended for ocaml compiler *)
96+
let mode = Parser.ParseForTypeChecker in
97+
(* if you want to target the printer use: let mode = Parser.Default in*)
98+
Parser.make ~mode src filename
99+
100+
let structure = NapkinscriptParser.parseImplementation p
101+
let signature = NapkinscriptParser.parseInterface p
102+
103+
let () = match p.Parser.diagnostics with
104+
| [] -> () (* no problems *)
105+
| diagnostics -> (* parser contains problems *)
106+
prerr_string (
107+
Diagnostics.stringOfReport
108+
~style:Diagnostics.Pretty
109+
diagnostics src
110+
)
111+
```

appveyor.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
platform:
2+
- x86
3+
4+
environment:
5+
FORK_USER: ocaml
6+
FORK_BRANCH: master
7+
CYG_ROOT: C:\cygwin64
8+
9+
install:
10+
- ps: iex ((new-object net.webclient).DownloadString("https://raw.githubusercontent.com/$env:FORK_USER/ocaml-ci-scripts/$env:FORK_BRANCH/appveyor-install.ps1"))
11+
12+
build_script:
13+
- call %CYG_ROOT%\bin\bash.exe -l %APPVEYOR_BUILD_FOLDER%\appveyor-opam.sh

0 commit comments

Comments
 (0)