2016-12-23 9 views
0

Ich habe einen local Block mit wenigen Hilfsmethoden. Danach kommt eine Hauptfunktion (zwischen dem in und end Block):Warum "in" durch "let" in sml ersetzen?

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; 

wo die ... für die Umsetzung steht. Und insert ist die "Haupt" -Funktion. SML gibt mir diese Ausgabe:

- 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 

Ich verstehe nicht, warum sollte ich in mit let ersetzt werden?

+2

Diese Fehlermeldung ist kein Vorschlag - es ist ein Zeichen, dass der Compiler durch Ihren Code verwirrt ist. Etwas führte zu der Schlussfolgerung, dass Sie eine "Let ... in" -Konstruktion versuchten, aber es fand "in", wo es ein "Let" - oder etwas in dieser Richtung - erwartete. Compiler-Syntaxfehlermeldungen sind in der Regel undurchschaubar. Das eigentliche Problem ist wahrscheinlich in den Auslassungspunkten in 'fun balance_tree ... 'versteckt. Vielleicht sollten Sie mehr vom relevanten Code zeigen. –

+0

@JohnColeman Ich habe den Code für 'balance_tree' hinzugefügt, ich denke du hast Recht, denn wenn ich diese Funktion auskommentiere, scheint der Code in Ordnung zu sein, ich konnte nicht finden, was damit falsch ist – ThunderWiring

+0

Es scheint, als ob du es nicht tust habe genug "else" -Klauseln. Sie haben 6 'if', 6' dann', aber nur 4' else'. –

Antwort

1

SML/NJ Parser Fehler sind ein wenig seltsam. Was es bedeutet, wenn "IN mit LET" zurückgeschickt wird, ist, dass es das Token "IN" (dh das Schlüsselwort "in") am Anfang von Zeile 58 gesehen hat, aber es blieb dort hängen, weil es keine Lösung gab was mit dem IN geht. In Situationen wie diesem führt es eine Fehlerbehebung durch, indem es vorgibt, dass Sie etwas anderes geschrieben haben, basierend auf einigen fest programmierten Regeln. Die Regeln sind nicht dafür ausgelegt, Ihr Programm zu reparieren, nur um das Parsen weiterlaufen zu lassen, so dass Sie bei einem Kompilierungsversuch mehrere Analysefehler sehen können. In diesem Fall heißt es nur, dass es vorgab, "LET" (d. H. Das Schlüsselwort "let") statt "IN" zu sehen, und dann fortfuhr, zu analysieren. Nach meiner Erfahrung ist der richtige Weg, um nur den Ort des ersten Parse-Fehlers zu sehen, zu beheben und neu zu kompilieren. Die späteren Fehler können sehr verwirrend sein, und ihre Nachricht darüber, wie sie versucht hat, wiederherzustellen, ist normalerweise nutzlos.