1

Ocaml を使用して小さなコンパイラを作成しています。私はAstをタイプチェックしてからSastに入れたいです。

しかし、次のように常にエラーが発生します。

  File "typecheck_debug.ml", line 93, characters 28-35:
    Error: This expression has type Sast.var_decl
           but an expression was expected of type Ast.var_decl

コードは次のとおりです。

    let rec trans_lval env = function
          Ast.Id(n) -> let vdecl = (find_variable env.scope n) in
                       Sast.Id(vdecl), vdecl.vvtype 

    ocamllex scanner.mll
    ocamlyacc parser.mly
    ocamlc -c ast.mli
    ocamlc -c parser.mli
    ocamlc -c scanner.ml
    ocamlc -c parser.ml
    ocamlc -c sast.mli
    ocamlc -c typecheck_debug.ml

私はなぜなのか理解していない。プロジェクトのプロセスに何か問題がありますか?

4

2 に答える 2

1

そのほんの少しのコードから判断するのは難しいですが、引数としてSast.Idtypeの値を期待しているように聞こえますが、typeの値を生成するので、それがのtypeです。Sast.var_declfind_variableAst.var_declvdecl

ここでは、93行目の文字28〜35がであると想定しています(vdecl)。そうでない場合は、明確にしてください。

于 2012-12-17T21:07:48.437 に答える
0

もう1つの可能性は、問題がそこにあるのではなく、関数の別のアームにあるというtrans_lvalことです(これは表示されませんが、他にもあるはずです.astはIdsだけではできません)。コードのどの部分が原因であるかを確認する簡単な方法は、次のとおりです。

  1. たとえば、関数に明示的な型注釈を追加します。

    let rec trans_lval : Ast.lval -> Sast.lval = function
       (*  code follows *)
    

    (これはおそらく間違っています。提供された情報から関数の実際のタイプを明らかに判断することはできません)。

  2. エラーが消えるまで、関数コードのビットをコメントアウトします。これが発生すると、少なくともコメントアウトしたコードの最後のビットに競合が存在することがわかります。その後、その問題を解決しようとするかもしれません。

  3. その後、他のコメントされたビットのコメントを外し、プロセスに表示される他の問題を解決します。

于 2013-02-13T13:05:27.367 に答える