2011-06-17 39 views
4

我在Ocaml中編寫了一個小型編譯器。在ast.mli,我已經定義2種表達式用Ocaml編寫的編譯器中的表達式類型

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 

有誰能告訴我,我可以如何改變我的表達結構ssion類型,以便eval_expression有效?非常感謝你!

+0

你能準確顯示線路故障報告在額外的周圍環境和幾行? – dcolish

+0

確切的故障線路(63)是'| Bool_constant b - > ...'在我的文章中的'eval_expression'函數中。 – SoftTimur

回答

4

你需要寫其他類型的任意類型的表達式:

type expr = Iexpr of int_expr 
      | Bexpr of bool_expr 

和類型可能是整數或布爾

type value = Ivalue of int 
      | Bvalue of bool 

,並寫一個函數evaluate : expr -> value最終值。

對於它的價值,我從來沒有覺得用這種方式將允許的表達式以這種方式靜態分離爲int類型和bool類型的表達式在類似ML的語言中是非常值得的。一旦將更豐富的類型添加到對象語言中,就會產生大量重複的語法。你真正想要的是將對象語言類型踢入你的實現語言的類型層,但最終會在ML中變得非常醜陋。它在Haskell更豐富的類型和類型的機器中稍微好一些,但它仍然感覺像是一種非常受影響的編程風格。

最後,對於小一次性解釋我通常只編寫了獨立tpexpr類型的類型和表達我的對象的語言,寫的EVAL爲expr -> tp -> value