This document describes syntax and semantics for describing programming languages. It begins by introducing syntax as the form or structure of a language and semantics as the meaning. It then discusses formal methods for describing syntax, including context-free grammars (CFGs), Backus-Naur Form (BNF), derivations, parse trees, and ambiguity. Attribute grammars are introduced as a way to incorporate semantic information into CFGs. Operational and denotational semantics are discussed as approaches to formally describing the meaning of programs. Examples are provided for BNF syntax rules, derivations, attribute grammars, and a denotational semantics for expressions.