2016-04-27 89 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显示代码需要写入的顺序。杰克如此结构化的原因是为了尽可能简化后续的编译器编写。 –