Compiler errors 为什么';这个最小的Jack(nand2tetris)程序不能编译吗?

Compiler errors 为什么';这个最小的Jack(nand2tetris)程序不能编译吗?,compiler-errors,nand2tetris,Compiler Errors,Nand2tetris,作为课程的一部分,我正在使用一种叫做的语言 这将编译并生成运行时预期的输出: class Main { function void main() { var Foo f; do f.doSomething(); return; } } class Foo { method void doSomething() { do Output.printString("Hello, world!");

作为课程的一部分,我正在使用一种叫做的语言

这将编译并生成运行时预期的输出:

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;
    }
}
…我收到以下编译器错误:

在Main.jack中(第6行):在子程序Main中:预期语句(do、let、while、return或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;
    }
} 

PDF的幻灯片26,如果其他人正在搜索它。需要明确的是,所有局部变量声明都必须在语句之前。PDF的幻灯片26显示了编写代码的顺序。Jack如此结构化的原因是为了使编译器的后续编写尽可能简单。