2010-11-19 3 views
0

В следующих разделах кода я получаю ошибки, которые я не уверен, почему я их получаю, несмотря на использование всех моих ресурсов для их исследования. Это кодирование SMLNJ.SML синтаксическая ошибка help

compComm (DeallocComm(var, exp), env, ip, codes, contIP)= 
let val loc = lookupEnv var env; 
    val codes1 = emitByte(LDC, ip, codes); 
    val codes2 = emitByte(Arg loc, ip + 1, codes1); 
    val (ip', codes3) = compExp(exp, env, ip+2, codes2); 
    val codes4 = emitByte(ADEALLOC, ip', codes3); 
    in(ip'+1, codes4, nil, contIP) 
    end; 

дает

hw4.sml: 339.5-433.6 Ошибка: не-конструктор применяется к аргументу в шаблоне: DeallocComm hw4.sml: 427.26-427.29 Ошибка: несвязанных переменная или конструктор: вар

hw4.sml: 430.31-430.34 Ошибка: несвязанных переменная или конструктор: ехр

и

ADEALLOC => let val (n, stack') = popStack stack 
val (loc, stack'') = popStack stack'; 
fun loop'(n, loc, store) = 
    val store' = updateTable (loc, defaultIntValue, store); 
    in loop'(n-1, loc+1, store) = 
    val store'' = loop'(n, loc, store) end; 
in loop(ip+1, store'', stack'') end; 

дает

hw4.sml: 612,14 Ошибка: ошибка синтаксиса: вставив EQUALOP

hw4.sml: 615.8-615.11 Ошибка: ошибка синтаксиса: замена VAL с END

любая помощь на них будут оценены ,

ответ

0

так что для первого, я думаю, что он не может найти конструктор DeallocComm. (где это указано?)

во втором, это не имеет никакого смысла. я понятия не имею, что вы делаете. store' и store'' внутри функции loop' или снаружи? если первый, то почему он не находится внутри let? если последний, где находится тело loop'; и как вы можете использовать store'' в выражении в конце, которое находится вне функции? также нет значения, которое называется loop. кажется, что вам не хватает большого количества fun, let и других вещей.

1

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

Так вы хотите, чтобы ваша функция декларации быть:

compComm (DeallocComm, env, ip, codes, contIP)= 

, а затем использовать DeallocComm в организме. Как бы то ни было, вы создаете переменную среды, которая имеет значение, но не имеет имени. DeallocComm (var, exp) оценивает до того, как передается в функцию.

+0

@Crowbreak, попробуйте дать более подробные рекомендации пользователю, –

+0

Правильно, извините. Спасибо! – Crowbeak