Почему заменить `in` на`let` в sml?

У меня есть local блок с несколькими вспомогательными методами. После этого идет основная функция (между in а также end блок):

datatype color = BLACK | RED;
datatype 'a RBTree = Nil
        | Br of (int * 'a * color) * 'a RBTree * 'a RBTree;
datatype Balance = RR | LR | LL | RL;

exception NotFound;  

local   
    fun max (num1, num2) ...    
    fun get_hight ...
    fun get_balance_factor ...
    fun LL_rotate ...
    fun LR_rotate ...
    fun RR_rotate ...
    fun RL_rotate ...
fun balance_tree (Nil) = (Nil)
    | balance_tree (Br(node, Nil, Nil)) = (Br(node, Nil, Nil))
    | balance_tree (Br(node, left, right)) = 
        if (get_balance_factor (Br(node, left, right))) = 2 then 
            if (get_balance_factor left) = ~1 then (* LR *)
                LR_rotate (Br(node, left, right))
            else if (get_balance_factor left) > ~1 then (* LL *)
                LL_rotate (Br(node, left, right))
        else if (get_balance_factor Br(node, left, right)) = ~2 then
            if (get_balance_factor right) = 1 then  (* RL *)
                RL_rotate (Br(node, left, right))
            else if (get_balance_factor right) < 1 then (* RR *)
                RR_rotate (Br(node, left, right))
        else (Br(node, left, right))
in
    fun insert ((Nil), item) = Br(item, (Nil), (Nil) )
        | insert ( (Br(node, left, right)), item) = 
            if (#1(node) = #1(node)) then  
                (Br(item, left, right))
            else if (#1(node) < #1(node)) then              
                balance_tree (Br(node, insert(left, item), right))
            else                
                balance_tree (Br(node, left, insert(right, item)))
end;

где ... выступает за реализацию. А также insert является основной функцией. SML дает мне такой вывод:

- use "ex4.sml";
[opening ex4.sml]
datatype color = BLACK | RED
datatype 'a RBTree = Br of (int * 'a * color) * 'a RBTree * 'a RBTree | Nil
datatype Balance = LL | LR | RL | RR
exception NotFound
ex4.sml:58.1-58.3 Error: syntax error: replacing  IN with  LET
ex4.sml:69.1 Error: syntax error found at END

uncaught exception Compile [Compile: "syntax error"]
  raised at: ../compiler/Parse/main/smlfile.sml:15.24-15.46
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

Я не понимаю, почему я должен заменить in с let?

1 ответ

Ошибки парсера в SML/NJ немного странные. Когда он говорит "переделать IN с помощью LET", это означает, что он увидел токен "IN" (т. Е. Ключевое слово "in") в начале строки 58, но он застрял при разборе, потому что у него не было способа разрешить что идет с IN. В подобных ситуациях он выполняет восстановление после ошибок, делая вид, что вы написали что-то другое, я думаю, основываясь на некоторых жестко заданных правилах. Правила не предназначены для исправления вашей программы, просто для продолжения анализа, чтобы вы могли видеть несколько ошибок анализа в одной попытке компиляции. В данном случае это просто говорит о том, что он сделал вид, что видит "LET" (т. Е. Ключевое слово "let") вместо "IN", а затем продолжил попытки анализа. По моему опыту, правильный способ продолжить - просто посмотреть на местоположение первой ошибки разбора, исправить ее и перекомпилировать. Последующие ошибки могут быть очень запутанными, и сообщение о том, как они пытались восстановить, обычно бесполезно.

Другие вопросы по тегам