Context-free languages can be described using context-free grammars, which are recursive rules that generate strings in a language. An example grammar is presented that generates strings of 1s and 0s separated by # symbols. Context-free grammars consist of variables, terminals, rules with variables on the left-hand side replacing with strings on the right-hand side, and a starting variable. Context-free languages can be recognized by pushdown automata using an extra stack. Regular languages are a subset of context-free languages. Context-free languages have closure properties including union, concatenation, and homomorphism. Derivation trees can represent grammar derivations and Backus-Naur form is a notation for compactly representing