string parser_error_message(int kind, object ob, mixed arg, int flag) {
    string ret;
    if (ob) 
        ret = ob->short() + ": ";
    else
        ret = "";
    switch (kind) {
        case 1:
            if (flag)
                return ret + "There is no such " + arg + " here.\n";
            else
                return ret + "There is no " + arg + " here.\n";
            break;
        case 2:
            if (flag)
                return ret + "None of the " + pluralize(arg) + " are alive.\n";
            else
                return ret + "The " + arg + " isn't alive.\n";
            break;
        case 3:
            if (flag)
                return ret + "You can't reach them.\n";
            else
                return ret + "You can't reach it.\n";
            break;
        case 4:
            {
                array descs = unique_array(arg, (: $1->the_short() :));
                string str;
                if (sizeof(descs) == 1)
                    return ret + "Which " + descs[0][0]->short() + " do you mean?\n";
                str = ret + "Do you mean ";
                for (int i = 0; i < sizeof(descs); i++) {
                    if (sizeof(descs[i]) > 1)
                        str += "one of ";
                    str += descs[i][0]->the_short();
                    if (i == sizeof(descs) - 1)
                        str += " or ";
                    else 
                        str += ", ";
                }
                return str + "?\n";
            }
            break;
        case 5:
            if (arg > 1)
                return ret + "There are only " + arg + " of them.\n";
            else
                return ret + "There is only one of them.\n";
            break;
        case 6:
            return ret + arg;
        case 7:
            return ret + "There is no " + arg + " here.\n";
        case 8:
            return ret + "You can't use more than one object at a time with that verb.\n";
    }
}