Compiler construction 用Ocaml编写的编译器中的表达式类型
我正在用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
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->…
。