One parsing technique that covers a lot of ground for little code is parser combinators[0]. And the more space and time efficient Parsec library[1]. Recursive descent is not difficult to hand-roll but the correspondence between the code and BNF can be more obscured, whereas with parser combinators the correspondence is quite clear.
[0] http://www.cs.nott.ac.uk/~pszgmh/monparsing.pdf
[1] https://dspace.library.uu.nl/bitstream/handle/1874/2535/2001...