Skip to content

hsk/min-caml-js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mincaml-js

mincaml-jsはocamlのサブセットからJavaScriptへ変換するトランスレータ言語です。 トランスレータにのみ特化することで、シンプルさを維持します。 mincaml-jsはmincamlにいくつかの機能が追加されています。

src,src2,src3,scalaへそれぞれ移動してmakeを実行します。

$ make

使い方は以下のように./mincaml [拡張子なしのファイル名]で、.mlファイルから.jsファイルを生成し、NodeJSで実行します。

$ ./mincaml test/fib
$ node test/fib.js

mincaml2jsには、4つのバージョンがあります。

  1. ocamlyacc によるバージョン
  2. パーサコンビネータによるバージョン
  3. scalaのパーサコンビネータによるバージョン
  4. より奇麗なJavaScriptの出力バージョン

テスト

$ make do_test

ソースファイル

  1. ocamlyaccバージョン
    1. syntax.ml 構文木定義
    2. parser.mly パーサ
    3. lexer.mll レキサー
    4. to_if.ml match if 変換
    5. emit.ml JavaScript出力
    6. main.ml メイン
  2. パーサコンビネータバージョン
    1. syntax.ml 構文木定義
    2. peg.ml パーサコンビネータライブラリ
    3. parser.ml パーサ
    4. to_if.ml match if 変換
    5. emit.ml JavaScript出力
    6. main.ml メイン
  3. Scalaバージョン
    1. mincaml2js.scala Scalaバージョン(1ソース)
  4. より奇麗なJavaScriptの出力バージョン
    1. syntax.ml 構文木定義
    2. peg.ml パーサコンビネータライブラリ
    3. parser.ml パーサ
    4. to_if.ml match if 変換
    5. alpha.ml α変換
    6. inline.ml インライン展開
    7. javascript.ml javascript変換
    8. emit.ml JavaScript出力
    9. main.ml メイン

TODO

  • ファイルの整理

  • ドキュメント

    • 簡単な変換
    • より高度な変換
  • 仕様追加

    • begin end
    • パターンマッチング構文
      • match e with | p1 -> e1 | ... | pn -> en
      • _
      • 値バインディング
      • ネストした値バインディング
      • ネストした値の比較
      • whenによるガード
      • asでの値バインディング
      • | A(a) | B(a) when a > 0 -> a
    • リスト
      • [e1;...;en]でのリストの構築
      • e::el によるリストへの追加
      • e @ e でのリストの結合
      • Listモジュール
    • 代数データ型
      • type i = I of int;; I(11)
      • タプル type i = Add of i * i | Int of i
      • リストの使用 type i = I of int list
    • 文字列
      • 文字列リテラル
    • リファレンス
    • レコード
    • トップレベル
      • let a = b
      • let rec a = b
      • exp
      • type a = b
      • open
      • module = struct ... end
    • 最適化
      • α変換 alpha
      • javascript変換 javascript
      • インライン展開 inline
      • ネストしたletの簡約 assoc
      • 定数畳み込み constfold
      • 不要定義削除 elim
    • ユーザー定義オペレーター