9

expr.mlファイルにexpr型があります。parser.mly(OCamlyaccファイル)で、exprルールを定義し、次のタイプを指定します。

    %start expr
    %type <expr> expr

しかし、私は得る:

    File "parser.mli", line 34, characters 48-52:
    Error: Unbound type constructor expr

追加してみました

    %{
      open Expr
    %}

.mlyファイルの先頭にありますが、それでも機能しません。このexprタイプを外部ファイルで定義し、ルールの戻り値として使用するにはどうすればよいですか?ありがとう。

4

3 に答える 3

10

exprタイプをモジュール名で修飾する必要があります。つまり、expression.ml(を使用してtype expr = ...)で定義されている場合は、

%type <Expresssion.expr> main

Eモジュール名を使用するときは大文字に注意してください。

于 2011-06-15T17:07:51.040 に答える
2

正しく理解しているかどうかわかりません。

しかし、あなたは循環依存に苦しんでいますか?Tあなたのタイプが含まれていて、パーサーを呼び出すとしましょうP。に依存するためP、タイプを生成できません。その逆ではありません。通常、タイプ情報を含む3番目のファイルを作成しました。T.tTPT'

例えば、

T.ml

 let parse filename : T'.t =
     filename
         |> open_in
         |> Lexing.from_channel
         |> P.command L.token

午後

%type <T'.t> command
%start command
%%

T'.ml

type t = Label of String
       | Integer of String
       | Float of string
       | Star of t
于 2011-06-15T15:28:20.353 に答える
1

.mliOcamlyaccでは、interface( )ファイルで生成するテキストを指定できません。したがって、インターフェイスに入るタイプ(トークンまたはルールのタイプ)を指定する場合は常に、完全修飾タイプを使用する必要があります。

ここでは、完全修飾タイプを使用できるように見えますが、タイプにファンクターアプリケーションが含まれているため、それが不可能な場合があります。いくつかの回避策があります。

  • すべてのファンクターを別のコンパイルユニットに構築するように手配します。これは簡単ですが、ファンクターにトークンタイプが含まれている場合などは機能しません。
  • ocamlyaccで生成されたファイルを後処理して.mli、ヘッダーを追加します。この方法でほとんど何でもできますが、それは醜くて迷惑です。
  • Ocamlyaccの改良された代替品であるMenhirを使用してください。これは追加の依存関係ですが、Ocamlyaccの主な欠点を解決します。
于 2011-06-16T13:25:15.690 に答える