此表达式的类型为Sast.var_decl,但表达式的类型为Ast.var_decl(使用Ocaml编写编译)

时间:2012-12-17 20:51:30

标签: ocaml

我正在使用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

我不明白为什么。我的项目流程有问题吗?

2 个答案:

答案 0 :(得分:1)

很难从一小段代码中分辨出来,但听起来像Sast.Id期望类型为Sast.var_decl的值作为其参数,但find_variable生成的值为{ {1}},这是Ast.var_decl的类型。

我在这里假设第93行,第28-35个字符是vdecl。如果情况并非如此,请澄清。

答案 1 :(得分:0)

另一种可能性是问题不存在,但在函数trans_lval的另一个部分(你没有展示,但必须有其他部分,你的不仅仅是{ {1}} S)。检查代码的哪个部分是罪魁祸首的简单方法在于:

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

    Id

    (这可能是错的,我显然无法从你提供的信息中告诉你函数的真实类型。)

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

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