OCaml

Formatの文字列化

OCamlのフォーマッタで文字列化する方法 let spp pp_v () v = Format.fprintf Format.str_formatter "%a" pp_v v; Format.flush_str_formatter ()

OCamlのmliの出力方法

OCamlの型が分からない場合に、推論結果が欲しくなった。 ググってもすぐ見つからない。ということでメモ。 ocaml -i a.ml > a.mli と書く。複数ファイルある場合は、 ocaml a.ml -i b.ml > b.mli

スタックマシン

OCamlではリストでスタックを表しパターンマッチで奇麗にスタックマシンを書く事が出来ます。 let rec eval (s,c) = match (s,c) with | `I a::`I b::s,`O "+"::c -> eval (`I(a+b)::s, c) | `I a::`I b::s,`O "-"::c -> eval (`I(a-b)::s, c) | `I a::`I b:…

Yet Another LLVM IR Compiler to X86_64

https://bitbucket.org/h_sakurai/yallc/srcllcをmlで書いてみました。 LLVMには依存してなくて、パーサとコンパイラがあるだけです。 出来る事は、四則演算しかないんですけど、これを拡張していけば、 バッグエンドの仕組みが分かるはず。現状は、スタック…

OCamlの型検査の働きもしくは多相性とガベージコレクションが共通して持つ物

結局、次に作成するコンパイラはCamlP4は使わずにocamlyaccとocamllexでMinCamlに近い形で作る事にしました。 そして、テストファーストで四則演算、それ以外の関係演算子や比較演算子、論理演算子等を加え、LLVMに出力し、参照を導入して、mutableな変数の…

後置、前置、cast

とりあえず、三項演算子以外のCの式のほとんどをカバーする所まで作ってみました。 プリプロセッサとして、Lisp的なマクロを行う場合はこの方式は良さそうだけど、今はユーザー定義の演算子は必要ないのでこの方式は一度、ここで止める事にしました。 (* $ o…

様々な演算子

演算子順位法を使って、C言語の2項演算子をパース出来るようにしました。 &と*はポインタ演算に使うので特殊に扱いますが、基本的に記号の連続は1つの演算子として字句解析するようにしました。 (* $ ocamlc -pp camlp4o calc.ml *) open Format type toke…

operator precedence

今回は、四則演算のパーサを優先順位法を使って書き換えたバージョンを書きました。 テストは前回と同じだけど、Hashtblを使っています。これがさらっとかけるようになれば、LLVMのカレイドスコープのパーサも簡単と言えるようになるでしょう。 (* $ ocamlc …

test first

四則演算のパーサを作る際に、テストファーストにするとよいはずです。という事で、テストだけ先に書きます。 (* $ ocamlc -pp camlp4o calc.ml *) open Format type token = | Number of float | Op of char type e = | Num of float | Bin of e * string *…

四則演算

EXTENDを使わないでCamlp4使って四則演算を作れるところまで何段階かに分けて書いてみました。今はocamllex/ulex + menhir がよいらしいんですけど ま、使ってみないと分からないし。 (* $ ocamlc -pp camlp4o test2.ml $ ./a.out *) open Format (* 字句解…

CamlP4を使ってトークンを1つ取り出す

とりあえず、取り出すだけなら以下のコードで出来ました。 (* $ ocamlc -pp camlp4o test2.ml *) open Format type token = Number of float let print_token ppf = function | Number n -> fprintf ppf "Number(%f)@?" n let rec lex = parser (* Skip any …

LLVM OCaml Samples

OCamlでLLVMのライブラリを使うのにサンプルコードが欲しいので書き始めました。https://bitbucket.org/h_sakurai/llvm-ocaml-samples/wiki/Home

Cの.hからAdaへのトランスレータ Head Master

世の中には様々なプログラミング言語が多数存在しています。 その中でOSに近いライブラリのほとんどはC言語のヘッダーファイルにより定義されています。 C以外の言語ではCのヘッダファイルを読み込み変換して使うことになります。 この変換作業のことをポー…

MinCaml読む

次の仕事が決まったので、自由な時間が短くなってしまいました。ってことで、ペースダウンしてしまいます。 てことで、Scalaに移植したものを読んでみてます。 うーん。やっぱりScalaいいよ。Scala。読みやすい。 ということで、MinCamlの把握をようやく出来…

の個人的感想

YTさんのあたりみてて、、、。 式ベースの言語であるのは好み。 camlp4は、使ってないけど、原理的なものは分かってきたつもり。式だから楽できるんだと思う。 ;や,の使い方がより一般的になってる。リストは、;で区切るので,はタプル用の演算子だ!!!って…

リファレンス作りてー

かなり、もう、OCamlに走ってしまおうかなと思う今日この頃です。 とりあえず、リファレンスを勝手に読みやすく作ってみたいなとか思った。 いや、思っただけですが。

スタックマシン

type t = | POP | PUSHI of int | ADD | SUB | MUL | PRINTI | RET let codes = [| PUSHI 1; PUSHI 2; ADD; PUSHI 10; SUB; PUSHI 100; MUL; PRINTI; RET ] let rec exec stack pc = ( let code = codes.(pc) in let npc = pc + 1 in match (codes.(pc), sta…

書き方

OCamlの文法は、カッコを使わないで、かつ、begin,endなんかもない、かつ、 ネストも使わないっていう文法らしく、読みずらい。 特に、C言語風の構文が好きな自分としては、読みずらい。 しかしながら、OCamlの場合はほとんどが式なので、()でくくることがで…

flashコンパイラ

また性懲りもなく、美しい日本のMLコンパイラのソースを眺めてしまった。 で、ようやく、慣れてきたらしいので、四則演算の結果をswfで出力するだけの 何の役にも立たないコンパイラが出来上がりました。 ようやく、意味解析とか、そこら辺の領域にやってき…

swflib

swflibのソースをゴチャゴチャいじりまわして、画像とか出力できるようになりました。 使ってみた感じは、swfの仕様と見比べながら使えば使えるけど、 そうでないと困るだろうなぁって感じです。 なーんも出さないout.swfを生成 open Swf open SwfParser let…