let drop_eof program =
    let rec eof_drop rtokens = function
        | EOF::[] -> List.rev rtokens
        | EOF::rest -> raise(Failure("Misplaced EOF"))
        | [] -> raise(Failure("No EOF available."))
        | tk::tks -> eof_drop (tk::rtokens) tks in
    eof_drop [] program