public void WriteExpr(CompilationUnit compUnit) { var compUnits = compUnit.CompUnits; if (compUnits.Count == 1) { Token token = compUnits[0]; if (token.TokenType == TokenType.INT_CONST) { _vmWriter.WritePush("constant", Convert.ToInt32(token.Value)); } else if (token.TokenType == TokenType.IDENTIFIER) { var sbUnit = SymbolTableManager.Find(token.Value); _vmWriter.WritePush(sbUnit.Kind.ToString(), sbUnit.Number); } } }
// // subroutineBody: '{' varDec* statements '}' public void CompileSubroutineBody(int depth, string subType, string subName, string className) { // compile: '{' var leftBraceToken = Eat("{"); // compile: varDec* while (_tokenizer.CurrentToken.Value == "var") { CompileVarDec(depth + 1); } _vmWriter.WriteFunction(string.Format("{0}.{1}", className, subName), SymbolTableManager.GetLocalsNum()); // if constructor -> allocate if (subType == "constructor") { int wordsToAllocate = SymbolTableManager.GetFieldsNum(); _vmWriter.WritePush("constant", wordsToAllocate); _vmWriter.WriteCall("Memory.alloc", 1); _vmWriter.WritePop("pointer", 0); } else if (subType == "method") { _vmWriter.WritePush("argument", 0); _vmWriter.WritePop("pointer", 0); } // compile: statements CompileStatements(depth + 1); // compile: '}' var rightBraceToken = Eat("}"); }