OCamlを使ってOCamlファイル(.ml)を解析したい。分析のためにファイルを抽象構文木に分割したいと考えています。camlp4 を使用しようとしましたが、うまくいきませんでした。他の誰かがこれを成功させたことがありますか? これは OCaml ファイルを解析する最良の方法ですか?
2 に答える
(OCaml の基本的な部分は既に知っていると思います: OCaml コードの書き方、モジュールとライブラリのリンク方法、ビルド スクリプトの書き方など。もしそうでない場合は、まずそれらを学んでください。)
最善の方法は、定義上 100% 互換性があるため、OCaml コンパイラ自体で使用される本物の OCaml コード パーサーを使用することです。
CamlP4 も OCaml パーサーを実装していますが、本物のパーサーとは少し互換性がなく、構文木は構文拡張の記述に特化しています。他の種類の分析にはあまり適していません。
.ml
P4 を使用して、構文拡張子を持つファイルを解析したい場合があります。この場合でも、正規のパーサーを使用する必要があります。P4 でソース コードを desugar してから、正規のパーサーを使用してアナライザーに結果を送信できます。
OCaml コンパイラのパーサーを使用するには、最も簡単な方法は、compiler-libs.common OCamlFind パッケージを使用することです。OCaml コンパイラのパーサーと型チェッカーが含まれています。
OCaml コンパイラ ソースの変更から始めてdriver/compile.ml
、主要なコンパイル フェーズを実装します: プリプロセッサの呼び出し、解析、入力、コード生成。ファイルを解析.ml
するには、変更 (または単純化) する必要がありますCompile.implementation
。.mli
ファイル用Compile.interface
。
幸運を。
-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 操作モジュールに関する情報があります。