2010-07-06 137 views
1

這段代碼有什麼問題?這個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 

錯誤是Error: Syntax error關係到最後else關鍵字。

我對OCaml很有信心,但if/else鏈仍然給我帶來一些麻煩。這不是第一次(我上次利用流來避免使用else關鍵字)。

我認爲這是小東西,但沒有線索,根據語法規範應該是確定

回答

4

分號具有優先級低於if-else語句,所以當你需要有兩個或兩個以上的語句塊分離由if內分號,你需要將它們用括號或begin...end塊(兩者是等同的):

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

謝謝你,這是一個困難的:) 所以它試圖解析結束,如果身體在預期的結尾找到'else'不成對的愚蠢的東西之前。現在很清楚! – Jack 2010-07-06 10:31:59