我正在使用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
我不明白为什么。我的项目流程有问题吗?
答案 0 :(得分:1)
很难从一小段代码中分辨出来,但听起来像Sast.Id
期望类型为Sast.var_decl
的值作为其参数,但find_variable
生成的值为{ {1}},这是Ast.var_decl
的类型。
我在这里假设第93行,第28-35个字符是vdecl
。如果情况并非如此,请澄清。
答案 1 :(得分:0)
另一种可能性是问题不存在,但在函数trans_lval
的另一个部分(你没有展示,但必须有其他部分,你的不仅仅是{ {1}} S)。检查代码的哪个部分是罪魁祸首的简单方法在于:
为您的函数添加显式类型注释,例如:
Id
(这可能是错的,我显然无法从你提供的信息中告诉你函数的真实类型。)
注释掉功能代码的各个部分,直到错误消失。 当它发生时,你知道至少在你注释掉的最后一段代码中存在冲突。您可以尝试解决该问题。
之后取消注释其他注释位,并解决过程中出现的任何其他问题。