re-wrote some parser code to deal with epsilons