为什么这个最小的 Jack (nand2tetris) 程序不能编译?

Why doesn't this minimal Jack (nand2tetris) program compile?

我正在使用一种名为 Jack, as part of the 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)

为什么附加的行会有所不同?

有些编程语言比其他语言结构化程度更高。 Jack好像对允许声明变量的地方很严格

您提供的以下 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;
    }
}