Parsing in C# from first principles - Nicholas Blumhardt