2
type VAR = identifier
type code = instruction list
type environment = identifier list
type EXPR = environment -> code * environment
fun ADD_OP expr expr' env = DUMMY
fun SUB_OP expr expr' env = DUMMY
fun MUL_OP expr expr' env = DUMMY
fun DIV_OP expr expr' env = DUMMY
fun MOD_OP expr expr' env = DUMMY
fun NUM n env = ([I_Int n],env)
我想在這裏寫一個繼續功能。此代碼是用於執行機器指令的較大代碼的一部分。這段代碼的功能是將抽象的語法代碼翻譯成機器碼。下面是該組的機器代碼,這需要兩個操作數從堆棧執行的操作和推壓導致上堆疊爲什麼SML中的下面的繼續功能不起作用?
I_Add
I_Mod
I_Sub
I_Div
而
I_Int
推到堆棧中的整數值的指令的。如果在堆棧中找不到所需的操作數時嘗試執行指令,代碼將發出中止信號。假設你正在執行I_Add,那麼堆棧中必須有兩個操作數,否則它將發出中止信號。
,直到知道,我只設法寫I_Int操作
fun NUM n env = ([I_Int n],env)
正確的代碼此代碼推整數n壓入堆棧。我知道這裏的策略是先執行「EXPR」和「EXPR'」,然後添加到列表 指令我試着寫的代碼,這在下面的方式
fun ADD_OP expr expr' env = expr env
(fn ((c,_),env) => expr' env
(fn ((c',_),env) => ((c::c'::[I_Add]),env)))
但是這導致類型不匹配錯誤
Error: value type in structure doesn't match signature spec
name: ADD_OP
spec: ?.EXPR -> ?.EXPR -> ?.EXPR
actual: ('a -> ('b * 'c -> Machine.Code.instruction list * 'c) -> 'd)
-> 'e -> 'a -> 'd
請有人指出我在正確的方向如何解決這個錯誤。我知道我的方法是對的,但我不理解延續。我試了2天以上,但不能解決這個問題。如果有人知道有關如何在SML中編寫連續文章的任何教程,請幫助。
你能包括'instruction'以及定義是什麼? –