首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此表达式的类型为Sast.var_decl,但应为Ast.var_decl类型的表达式(使用Ocaml编写编译)

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

Stack Overflow用户
提问于 2012-12-18 04:51:30
回答 2查看 124关注 0票数 1

我正在使用Ocaml编写一个小编译器。我想先检查Ast,然后输入Sast。

但我总是得到如下错误:

代码语言:javascript
复制
  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

代码是:

代码语言:javascript
复制
    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

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

EN

回答 2

Stack Overflow用户

发布于 2012-12-18 05:07:48

从这一小段代码中很难看出,但听起来Sast.Id需要一个Sast.var_decl类型的值作为参数,但find_variable会产生一个Ast.var_decl类型的值,所以这就是vdecl的类型。

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

票数 1
EN

Stack Overflow用户

发布于 2013-02-13 21:05:27

另一种可能性是问题不在那里,而是在函数trans_lval的另一个臂中(您没有显示它,但肯定还有其他的,您的ast不能只由Ids组成)。检查代码的哪一部分是罪魁祸首的简单方法包括:

  1. 将显式类型批注添加到函数,例如:

让rec函数: Ast.lval -> Sast.lval = trans_lval (*代码跟在后面*)

(这可能是错误的,在错误消失之前,我显然不能从gave).

  • commenting出函数代码的信息中辨别出函数的真实类型。当它发生时,您知道冲突至少存在于您注释掉的最后一段代码中。然后你可以尝试解决这个问题。

  • 在那之后取消对其他评论的注释,并解决过程中出现的任何其他问题。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13921998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档