2016-04-27 5 views
1

Ich verwende eine Sprache namens Jack, als Teil der Nand2Tetris natürlich.Warum kompiliert dieses minimale Jack (nand2tetris) Programm nicht?

Dies kompiliert und erzeugt die Ausgabe Ich erwarte, dass bei der Ausführung:

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

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

Aber wenn ich eine Zeile hinzufügen ...

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; 
    } 
} 

... Ich erhalte diesen Compiler-Fehler:

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

Warum macht die zusätzliche Leitung einen Unterschied?

Antwort

1

Es gibt Programmiersprachen, die strukturierter als andere sind. Jack scheint sehr streng zu sein, wenn es darum geht, Variablen zu deklarieren.

Nach Jack Präsentation, die Sie zur Verfügung gestellt:

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

Verschieben Variable i Erklärung, wo es hingehört, sollten Sie Problem beheben.

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

     return; 
    } 
} 
+0

Folie 26 der PDF-Datei, wenn noch jemand danach sucht. –

+0

Um es klar zu stellen, das Problem ist, dass alle lokalen Variablen-Deklarationen vor Anweisungen kommen müssen. Folie 26 der PDF zeigt die Reihenfolge, in der der Code geschrieben werden muss. Der Grund, warum Jack so strukturiert ist, ist, das nachfolgende Schreiben des Compilers so einfach wie möglich zu machen. –