// // letStatement: 'let' varName ('[' expression ']')? '=' expression ';' public void CompileLetStatement(int depth) { bool isLeftArray = false; // compile: 'let' var letToken = Eat("let"); // compile: varName var varNameToken = EatIdentifier(); var sbVarName = SymbolTableManager.Find(varNameToken.Value); // compile: ('[' expression ']')? if (_tokenizer.CurrentToken.Value == "[") { isLeftArray = true; // compile: '[' var leftBracketToken = Eat("["); // compile: expression CompileExpression(depth + 1, AssignmentType.LEFT); // write array _vmWriter.WritePush(sbVarName.KindDisplay, sbVarName.Number); _vmWriter.WriteOp(new Token { Value = "+" }); // compile: ']' var rightBracketToken = Eat("]"); } // compile: '=' var assignmentToken = Eat("="); // compile: expression CompileExpression(depth + 1, AssignmentType.RIGHT); // pop varAssigned if (isLeftArray) { _vmWriter.WritePop("temp", 0); _vmWriter.WritePop("pointer", 1); _vmWriter.WritePush("temp", 0); _vmWriter.WritePop("that", 0); } else { _vmWriter.WritePop(sbVarName.KindDisplay, sbVarName.Number); } // compile: ';' var semiColonToken = Eat(";"); }