While tools like yacc/bison or Boost.Spirit are certainly very useful when getting a parser for a simple language working quickly, the need for hand-written parsers still prevails. Getting custom behavior with parser generators can sometimes be painful, and they aren't exactly designed for the debuggability of the resulting code. Additionally, error reporting and recovery can get troublesome. This talk will focus on recursive descent parsers and some of techniques that author found useful when implementing that kind of parsers. The primary focus will stay on the simplest case - LL(1) grammars - but LL(k) and LL(*) grammars will also be discussed. Other important and related topics, including designing an AST that makes sense, parser combinators, and tokenizing the input before actual parsing takes place, will also be featured. No prior experience with parsing is necessary to understand the contents of this talk.