A specification of tokens, a grammar,
and (if you're lucky) formal semantics. Usually degrades into a lot of hand waving and holy wars. Computers ultimately read things written in programming languages, but most of the fuss is about whether or not a human enjoys reading, writing, and maintaining the programs.