Summary
In this chapter, you learned how to represent base types and check the type safety of common operations, such as preventing adding an integer to a function. All of this can be accomplished by traversing the syntax tree.
You learned how to represent types in a data structure and add an attribute to the syntax tree nodes to store that information. You also learned how to write tree traversals that extract type information about variables and store that information in their symbol table entries. You then learned how to calculate the correct type at each tree node, checking whether the types are used correctly in the process. Finally, you learned how to report type errors that you found.
The process of type checking may seem like a thankless job that just results in a lot of error messages, but really, the type information that you compute at each of the operators and function calls in the syntax tree will be instrumental in determining what machine instructions to generate...