parser is now LL(1), which makes possible rewriting the input stream using getc/ungetc