This document discusses static type checking in compilers. It begins by describing the structure of a compiler and how static checking fits in. It then contrasts static and dynamic checking. The rest of the document discusses various aspects of static type checking like type rules, type systems, and implementing static checking using syntax-directed definitions in Yacc. It provides examples of basic type checking for expressions and statements in a simple language. It also discusses type expressions, conversions, and functions.