5

OCamlを使ってOCamlファイル(.ml)を解析したい。分析のためにファイルを抽象構文木に分割したいと考えています。camlp4 を使用しようとしましたが、うまくいきませんでした。他の誰かがこれを成功させたことがありますか? これは OCaml ファイルを解析する最良の方法ですか?

4

2 に答える 2

6

(OCaml の基本的な部分は既に知っていると思います: OCaml コードの書き方、モジュールとライブラリのリンク方法、ビルド スクリプトの書き方など。もしそうでない場合は、まずそれらを学んでください。)

最善の方法は、定義上 100% 互換性があるため、OCaml コンパイラ自体で使用される本物の OCaml コード パーサーを使用することです。

CamlP4 も OCaml パーサーを実装していますが、本物のパーサーとは少し互換性がなく、構文木は構文拡張の記述に特化しています。他の種類の分析にはあまり適していません。

.mlP4 を使用して、構文拡張子を持つファイルを解析したい場合があります。この場合でも、正規のパーサーを使用する必要があります。P4 でソース コードを desugar してから、正規のパーサーを使用してアナライザーに結果を送信できます。

OCaml コンパイラのパーサーを使用するには、最も簡単な方法は、compiler-libs.common OCamlFind パッケージを使用することです。OCaml コンパイラのパーサーと型チェッカーが含まれています。

OCaml コンパイラ ソースの変更から始めてdriver/compile.ml、主要なコンパイル フェーズを実装します: プリプロセッサの呼び出し、解析、入力、コード生成。ファイルを解析.mlするには、変更 (または単純化) する必要がありますCompile.implementation.mliファイル用Compile.interface

幸運を。

于 2014-04-23T02:35:51.870 に答える
2

-dparsetree オプションを ocaml コンパイラに使用できませんでしたか?

こんにちは.ml:

let _ = print_endline "Hello AST"

今それをコンパイルします:

$ ocamlc -dparsetree hello.ml

結果は次のとおりです。

[
  structure_item (hello.ml[1,0+0]..[1,0+33])
    Pstr_eval
    expression (hello.ml[1,0+8]..[1,0+33])
      Pexp_apply
      expression (hello.ml[1,0+8]..[1,0+21])
        Pexp_ident "print_endline" (hello.ml[1,0+8]..[1,0+21])
      [
        <label> ""
          expression (hello.ml[1,0+22]..[1,0+33])
            Pexp_constant Const_string("Hello AST",None)
      ]
]

拡張ポイント構文拡張 (OCaml 4.02 での構文拡張の新しい書き方) に関する情報が記載されている-ppx extensions に関するこのブログ投稿も参照してください。さまざまな AST 操作モジュールに関する情報があります。

于 2014-04-23T16:37:10.223 に答える