2016-12-23 7 views
0

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

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?

+2

Это сообщение об ошибке не является предложением - это признак того, что компилятор запутан вашим кодом. Что-то привело его к выводу, что вы пытались построить «let ... in», но нашли «in», где ожидали «let» - или что-то в этом направлении. Сообщения об ошибках синтаксиса компилятора обычно непостижимы. Фактическая проблема, вероятно, скрыта в многоточии в 'fun balance_tree ...'. Возможно, вы должны показать больше соответствующего кода. –

+0

@JohnColeman Я добавил код для 'balance_tree', я думаю, что вы правы, так как, когда я прокомментирую эту функцию, код выглядит нормально, я не смог найти, что с ним не так, хотя – ThunderWiring

+0

Кажется, имеют достаточно 'else'. У вас есть 6 'if', 6' then', но только 4 'else'. –

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^