more consistent parsing w/ better errors