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";
    }
}
