use exceptions to signal parse failures