more robust parsing and don't use id reserved word