This document discusses formal methods for describing the syntax and semantics of programming languages, including attribute grammars. It begins by introducing syntax and semantics, and the problem of formally defining a language. It then covers context-free grammars and Backus-Naur form (BNF) as a way to describe syntax. Attribute grammars are introduced as a method to incorporate semantic information into syntax rules through attributes and functions. An example attribute grammar checks for type consistency in an expression grammar.