Compiler construction 用Ocaml编写的编译器中的表达式类型

Compiler construction 用Ocaml编写的编译器中的表达式类型,compiler-construction,types,ocaml,Compiler Construction,Types,Ocaml,我正在用Ocaml编写一个小编译器。在ast.mli中,我定义了两种表达式 type int_expr = | Integer_constant of int | Evar of string | Ebinop of binop * int_expr * int_expr | Ecell of int_expr * int_expr (* Sheet[ , ] *) type bool_expr = | Bool_constant of bool | Bcmp of

我正在用Ocaml编写一个小编译器。在
ast.mli
中,我定义了两种表达式

type int_expr =
  | Integer_constant of int
  | Evar of string
  | Ebinop of binop * int_expr * int_expr
  | Ecell of int_expr * int_expr (* Sheet[ , ] *)

type bool_expr = 
  | Bool_constant of bool
  | Bcmp of cmp * int_expr * int_expr
  | Band of bool_expr * bool_expr
  | Bor of bool_expr * bool_expr
  | Bnot of bool_expr
interp.ml
中,我想定义一个名为
eval_expression
的函数来计算任何可以是int_expr或bool_expr的表达式

let rec eval_expression env = function
  | Integer_constant n -> Integer n
  | Ebinop (op, n, m) -> ...
  | Evar x -> ...
  | Ecell (r, c) -> ... 
  | Bool_constant b -> ...
  | Bnot c -> ...
  | Bor (c1, c2) -> ...
  | Band (c1, c2) -> ...
但它在编译时返回一个错误:

ocamlc  -c interp.ml
File "interp.ml", line 63, characters 4-19:
Error: This pattern matches values of type Ast.bool_expr
       but a pattern was expected which matches values of type Ast.int_expr
make: *** [interp.cmo] Error 2

有谁能告诉我如何更改表达式类型的结构,以便
eval\u expression
工作?多谢各位

您需要为任意类型的表达式编写另一种类型:

type expr = Iexpr of int_expr
          | Bexpr of bool_expr
以及最终值的类型,可以是整数或布尔值

type value = Ivalue of int
           | Bvalue of bool
并编写一个函数
evaluate:expr->value

值得一提的是,我从未觉得在类似ML的语言中,以这种方式静态地将允许的表达式分离为int类型和bool类型的表达式是值得的。一旦将更丰富的类型添加到对象语言中,就会产生大量重复的语法。您真正想要的是将对象语言类型踢到实现语言的类型层中,但这在ML中是非常难看的。在Haskell更丰富的类型和种类机制中,这稍微好一点,但它仍然感觉像是一种非常受影响的编程风格


最后,,对于小的一次性解释器,我通常只需为我的目标语言的类型和表达式分别编写
tp
expr
类型代码,并将求值写为
expr->tp->value

您能显示报告失败的确切行和周围上下文之外的几行吗?失败的确切行(63)在我的帖子中的
eval\u表达式
函数中是
| Bool\u常量b->…