2010-07-06 4 views
1

Quel est le problème avec ce code?Quel est le problème avec ce code OCaml?

let vm_run vm = 
    let guard = ref true in 
    while !guard do 
     if vm.cur_pc = -1 && not (Stack.empty vm.call_stack) then vm_pop_ar vm 
     else if vm.cur_pc = -1 then guard := false 
     else if vm.cur_pc < Array.length vm.cur_code then 
      execute vm Array.get vm.cur_code vm.cur_pc; 
      vm.cur_pc <- vm.cur_pc + 1 
     else vm_pop_ar vm 
    done 

erreur est Error: Syntax error en rapport avec le dernier mot-clé else.

J'ai atteint une bonne confiance avec OCaml mais une chaîne if/else me pose encore des problèmes ... ce n'est pas la première fois (la dernière fois que j'ai exploité flow pour éviter d'utiliser le mot-clé else).

Je pense qu'il est quelque chose de petit mais ont aucun indice, selon la spécification de la syntaxe, il devrait être ok

Répondre

4

Le point-virgule a priorité inférieur if-else, alors quand vous avez besoin d'avoir un bloc de deux états ou plus séparés par des points-virgules à l'intérieur d'un if, vous devez les enfermer entre parenthèses ou un begin...end bloc (les deux sont équivalents):

else if vm.cur_pc < Array.length vm.cur_code then begin 
     execute vm Array.get vm.cur_code vm.cur_pc; 
     vm.cur_pc <- vm.cur_pc + 1 
    end 
    else vm_pop_ar vm 
+0

Merci, c'était difficile :) il a tenté d'analyser si le corps mettre fin à la avant la fin prévue de trouver le 'else' impairs .. chose idiote. Maintenant c'est clair! – Jack