| Lexical elements | The Jack language includes five types of terminal elements (tokens): | 
|---|---|
| keyword | ‘class’ | ‘constructor’ | ‘function’ | ‘method’ | ‘field’ | ‘static’ | ‘var’ | ‘int’ | ‘char’ | ‘boolean’ | ‘void’ | ‘true’ | ‘false’ | ‘null’ | ‘this’ | ‘let’ | ‘do’ | ‘if’ | ‘else’ | ‘while’ | ‘return’ | 
| symbol | ‘{’ | ‘}’ | ‘(’ | ‘)’ | ‘[’ | ‘]’ | ‘.’ | ‘;’ | ‘;’ | ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘&’ | ‘|’ | ‘<’ | ‘>’ | ‘=’ | ‘~’ | 
| integerConstant | A decimal number in the range 0 .. 32767. | 
| stringConstant | ‘"’ A sequence of Unicode characters not including double quote or newline. ‘"’ | 
| identifier | A sequence of letters, digits, and underscore (‘_’) not starting with a digit. | 
| Program structure | A Jack program is a collection of classes, each appearing in a separate file. The compilation unit is a class. A class is a sequence of tokens structured according to the following context free syntax: | 
|---|---|
| class | ‘class’ className ‘{’ classVarDec* subroutineDec* ‘}’ | 
| classVarDec: | (‘static’ | ‘field’) type varName (‘,’ varName)* ‘;’ | 
| type | ‘int’ | ‘char’ | ‘boolean’ | className | 
| subroutineDec | (‘constructor’ | ‘function’ | ‘method’) (‘void’ | type) subroutineName ‘(’ parameterList ‘)’ subroutineBody | 
| parameterList | ((type varName) (‘,’ type varName)*)? | 
| subroutineBody | ‘{’ varDec* statements ‘}’ | 
| varDec | ‘var’ type varName (‘;’ varName)* ‘;’ | 
| className | identifier | 
| subroutineName | identifier | 
| varName | identifier | 
| Statements | |
|---|---|
| statements: | statement* | 
| statement: | letStatement | ifStatement | whileStatement | doStatement | returnStatement | 
| letStatement: | ‘let’ varName (‘[’ expression ‘]’)? ‘=’ expression ‘;’ | 
| ifStatement: | ‘if’ ‘(’ expression ‘)’ ‘{’ statements ‘}’ (‘else’ ‘{’ statements ‘}’)? | 
| whileStatement: | ‘while’ ‘(’ expression ‘)’ ‘{’ statements ‘}’ | 
| doStatement: | ‘do’ subroutineCall ‘;’ | 
| ReturnStatement: | ‘return’ expression? ‘;’ | 
| Expressions: | |
|---|---|
| expression: | term (op term)* | 
| term: | intergerConstant | stringConstant | keywordConstant | varName | varName ‘[’ expression ‘]’ | subroutineCall | ‘(’ expression ‘)’ | unaryOp term | 
| subroutineCall: | subroutineName ‘(’ expressionList ‘)’ | (className | varName) ‘.’ subroutineName ‘(’ expressionList ‘)’ | 
| expressionList: | (expression (‘,’ expression)* )? | 
| op: | ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘&’ | ‘|’ | ‘<’ | ‘>’ | ‘=’ | 
| unaryOp: | ‘-’ | ‘~’ | 
| KeywordConstant: | ‘true’ | ‘false’ | ‘null’ | ‘this’ |