2016-02-28 6 views
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) 

Этот код выталкивает число п на стек. Я знаю, что стратегия здесь является первым выполнить «выраж» и «выражение '», а затем добавить команду к списку Я попытался написать код для этого в поле ниже образом

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 

Пожалуйста, может кто-нибудь указать мне в правильном направлении, как решить эту ошибку. Я знаю, что мой подход прав, но я не понимаю продолжения. Я пробую это более двух дней, но не могу это решить. Пожалуйста, если кто-то знает какой-либо учебник о том, как писать комментарии в SML, которые также будут полезны.

+1

Вы можете включить определение 'instruction', а? –

ответ

2

Я не уверен, что это ваша проблема, но это не соответствует комментариям, и я не могу найти дубликат (есть несколько).

Загадочные «странные» типы, такие как , возникают, когда вы изменили определение типа после определения функции, которая его использует.

Пример:

- datatype None = A;; 
datatype None = A 
- fun f A = 3;; 
val f = fn : None -> int 
- f A;; 
val it = 3 : int 
- datatype None = A;; 
datatype None = A 
- f A;; 
stdIn:11.1-11.4 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: ?.None 
    operand:   None 
    in expression: 
    f A