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.Id期望 type 的值Sast.var_decl作为其参数,但find_variable产生的 value 为 type Ast.var_decl,所以这就是vdecl.

我在这里假设第 93 行,字符 28-35 是(vdecl). 如果不是这种情况,请澄清。

于 2012-12-17T21:07:48.437 回答
0

另一种可能性是问题不存在,而是在函数的另一个分支中trans_lval(你没有显示,但必须有其他的,你的 ast 不能只由Ids 组成)。检查代码的哪些部分是罪魁祸首的一种简单方法包括:

  1. 向您的函数添加显式类型注释,例如:

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

    (这可能是错误的,我显然无法从您提供的信息中分辨出您的功能的真实类型)。

  2. 注释掉你的功能代码,直到错误消失。当它发生时,您知道至少在您注释掉的最后一段代码中存在冲突。您可以尝试解决该问题。

  3. 之后取消注释其他注释位,并解决该过程中出现的任何其他问题。

于 2013-02-13T13:05:27.367 回答