2

compileOCaml プログラムを含む文字列を受け取り、コンパイルの結果を Correct または Error として出力する関数を持つ OCaml モジュールを書きたいと思います。また、Error の場合は、最初のエラーの行と文字に関する情報を出力します。エラーが何であったかは気にしません(少なくとも今のところ)。

このための基本的なモジュール タイプは次のとおりです。

module type Compile =
    sig
        type result = Correct | Error of (int*int)
        val compile : string -> result
    end

それを実装するには、少なくとも 2 つの根本的に異なる方法があります。

  1. 簡単なハック方法-- プログラムで文字列をファイルに書き込み、Unix プロセスを使用ocamlcしてコマンド ラインで呼び出し、stderr を解析します。
  2. 適切な方法-- OCaml ツールを使用してコードを分析します。

(1)については、stderrの中身がつかめず困っています。を使用することから始めました 。これによりUnix.open_process_in、stdout が in_channel にリダイレクトされ、それを読み取ることができます。コンパイルエラーは標準エラー出力に出力されるocamlcため(標準出力には出力されません)、使用しようとしました

let ic = Unix.open_process_in "ocamlc test.ml 2>&1" 

stderr の内容がコマンド ラインで stdout にリダイレクトされるようにします。ic このようにすると、コンパイルエラーが含まれると思います。残念ながら、これは事実ではなくicEnd_of_file.

次にUnix.create_process、out、in、err の新しいチャネルを選択できるコマンドに移動しました。しかし、これらのチャネルを選択するのに問題があります。プログラムでそれを読み取ることができるようにするには、出力チャネルをどのようにする必要がありますか?

(2)に関して、(合理的に)簡単な方法は何だと思いますか?

助けてくれてありがとう!

4

2 に答える 2

3

2) に関しては、OCaml のインストールには通常compiler-lib、パーサーを含むコンパイラを構成する多くのモジュールを含むディレクトリがあります。これは文書化されていませんが、コンパイルと型チェックに使用できる可能性があります。解析のために、前処理以外のことを行うために使用できる Camlp4 もあります (Camlp4 をプログラムにロードして、おそらく少しパッチを当てた後にライブラリとして使用できると思います) が、それには文法しか含まれていませんタイプチェッカーではありません。

于 2011-02-19T23:04:03.053 に答える
2

1) については、あなたは何か間違ったことをしたと思います。私のマシン上:

> ocaml unix.cma
        Objective Caml version 3.12.0

# let ic = Unix.open_process_in "ocamlc test.ml 2>&1";;
val ic : in_channel = <abstr>
# input_line ic;;
- : string = "File \"test.ml\", line 1, characters 0-1:"
# input_line ic;;
- : string = "Error: I/O error: test.ml: No such file or directory"
# input_line ic;;
Exception: End_of_file.

1 つの方法は、プログラムの標準入力を介してプロセスの出力を読み取ることができるように forをUnix.create_process渡すことです (これは、プログラムの stdin を他の目的で使用したくないことを前提としています)。しかし、私が使用するより簡単な方法です。Unix.stdinnew_stdoutUnix.open_process_full

2) については、使用を試みることができますtoplevellib.cma(ただし、これは完全に文書化されておらず、サポートされていないことに注意してください)。toplevel/toploop.mli特に、ディストリビューションで を見てくださいToploop.execute_phrase

于 2011-02-19T21:57:43.287 に答える