To Home
Last modified: Wed Jun 10 08:00:53 JST 2009

Ocamlのソースコードを眺める

Ocamlのparserを触ってみたい
parsing ディレクトリに主なソースがある misc 内のコードも参照している
Makefile
これを使って make bcl する。 parse.cma が作成されるのでこれをloadすれば よい。
Todo: リンク順を求める。graph.ml
prefixでまとめてグラフ折り畳み

そして、単純な関数適用をparseしてみた。
# let l = Lexing.from_channel stdin;;
val l : Lexing.lexbuf =
  ...
# Parse.implementation l;;
f x;;
- : Parsetree.structure =
[{Parsetree.pstr_desc =
   Parsetree.Pstr_eval
    {Parsetree.pexp_desc =
      Parsetree.Pexp_apply
       ({Parsetree.pexp_desc = Parsetree.Pexp_ident (Longident.Lident "f");
         Parsetree.pexp_loc =
          {Location.loc_start = 0; Location.loc_end = 1;
           Location.loc_ghost = false}},
       [("",
        {Parsetree.pexp_desc = Parsetree.Pexp_ident (Longident.Lident "x");
         Parsetree.pexp_loc =
          {Location.loc_start = 2; Location.loc_end = 3;
           Location.loc_ghost = false}})]);
     Parsetree.pexp_loc =
      {Location.loc_start = 0; Location.loc_end = 3;
       Location.loc_ghost = false}};
  Parsetree.pstr_loc =
   {Location.loc_start = 0; Location.loc_end = 3; Location.loc_ghost = true}}]
Pexp_applyが関数適用であることを表しているようだ
Parsetree.Pexp_apply(関数情報, [引数情報のリスト])
さて、訪問してみましょうか

そのまえに、Printastという神様のようなモジュールを発見。使ってみる。
# let t = Parse.implementation l;;
f x;;
val t : Parsetree.structure =
...
# Printast.implementation (Format.formatter_of_out_channel stdout) t;;
structure_item (0,3) ghost
  Pstr_eval
  expression (0,3)
    Pexp_apply
    expression (0,1)
      Pexp_ident "f"
    <label> ""
      expression (2,3)
        Pexp_ident "x"
- : unit = ()
# 
このPrintastを改造すればいろいろできそう!!

let f = g() ではうまくいった静的なコールグラフを書くプログラム。(let (x,y) = .. に対応していない。 クラスについてはでたらめ)
  visit.ml


作者: 増山隆 address
To Home
Valid HTML 4.01!