2016-04-27 88 views
1

我使用的語言是Jack,作爲Nand2Tetris課程的一部分。爲什麼這個最小的Jack(nand2tetris)程序不能編譯?

這編譯併產生我希望在運行時輸出:

class Main { 
    function void main() { 
     var Foo f; 
     do f.doSomething(); 
     return; 
    } 
} 

class Foo { 
    method void doSomething() { 
     do Output.printString("Hello, world!"); 
     return; 
    } 
} 

但是當我添加一行...

class Main { 
    function void main() { 
     var Foo f; 
     do f.doSomething(); 

     var int i; // doesn't seem to matter what's here, anything breaks it 

     return; 
    } 
} 

...我得到這個編譯器錯誤:

In Main.jack (line 6): In subroutine main: Expected statement(do, let, while, return, or if)

爲什麼附加行有所作爲?

回答

1

有編程語言比其他編程語言更結構化。 對於允許您聲明變量的地方,Jack似乎非常嚴格。

繼傑克介紹您提供:

subroutine_type name (parameter-list) { 
    local variable declarations 
    statements 
} 

移動變量i聲明其所屬的地方應該可以解決你的問題。

class Main { 
    function void main() { 
     var Foo f; 
     var int i; 
     do f.doSomething(); 

     return; 
    } 
} 
+0

幻燈片26的PDF,如果其他人正在搜索它。 –

+0

要明確,問題是所有局部變量聲明都需要在語句之前。 PDF幻燈片26顯示代碼需要寫入的順序。傑克如此結構化的原因是爲了儘可能簡化後續的編譯器編寫。 –