private static String usageMessage(ParserCompilerParameters args)
	{
		String rv = "";
		rv += "Usage: ParserCompiler [built-in-switches] [custom-switches] spec-file1 spec-file2 ... spec-filen\n";
		rv += "Built-in switches (all optional) are:\n";
		rv += "\t-?\tDisplay this usage information.\n\t\tUse ParserCompiler -pipeline [pipeline] -? to list\n\t\toptions specific to a given pipeline.\n";
		rv += "\t-version\tDisplay version information.\n";
		rv += "\t-package [package]\tThe package of the generated parser.\n\t\tDefaults to the default package or what is set in\n\t\tthe parser specification.\n";
		rv += "\t-parser [class]\tThe class name of the generated parser.\n\t\tDefaults to 'Parser' or what is set in\n\t\tthe parser specification.\n";
		rv += "\t-o [out]\tOutput the generated parser to the file 'out'.\n\t\tUse '-' to redirect to standard output, or no parameter\n\t\tto suppress output altogether.\n";
		rv += "\t-q\t\tRun the compiler quietly.\n";
		rv += "\t-v\t\tRun the compiler with extra verbosity.\n";
		rv += "\t-vv\t\tRun the compiler with even more extra verbosity.\n";
		rv += "\t-mda\tRun Copper's modular determinism analysis on the input.\n\t\t\tIf this switch is used, the input must comprise exactly\n\t\t\ttwo grammars: the host and an extension to test.\n";
		rv += "\t-avoidRecompile\tRun Copper only if one spec-file has a later\n\t\t\tmodification time than the output file.\n\t\t\tIf this switch is used, an output file must also\n\t\t\tbe specified.\n";
		rv += "\t-logfile [lout]\tPipe all log output to the file 'lout'\n\t\t\t(default standard error).\n";
		rv += "\t-dump\tProduce a detailed report of the grammar and generated parser.\n";
		rv += "\t-errordump\tProduce a detailed report, but only if the parser\n\t\t\tcompiler has generated an error.\n";
		rv += "\t-dumpfile [dout]\tPipe the dumped report to the file 'dout'\n\t\t\t\t(default to log output).\n";
		rv += "\t-dumptype [type]\tGenerate the dumped report in the\n\t\t\t\tspecified format:\n";
		for(String dt : CopperDumpType.strings())
		{
			rv += "\t\t" + dt + ": " + CopperDumpType.fromString(dt).usageMessage() + "\n";
		}
		rv += "\t-skin [skin]\tGenerate a parser based on input from the specified\n\t\t\tinput skin:\n";
		for(String st : CopperSkinType.strings())
		{
			rv += "\t\t" + st + ": " + CopperSkinType.fromString(st).usageMessage() + "\n";
		}
		rv += "\t-engine [eng]\tGenerate a parser based on the specified parsing engine:\n";
		for(String et : CopperEngineType.strings())
		{
			rv += "\t\t" + et + ": " + CopperEngineType.fromString(et).usageMessage() + "\n";
		}
		rv += "\t-pipeline [pipe]\tGenerate a parser using the specified\n\t\t\t\tcompilation \"pipeline\":\n";
		for(String pt : CopperPipelineType.strings())
		{
			rv += "\t\t" + pt + ": " + CopperPipelineType.fromString(pt).usageMessage() + "\n";
		}
		if(args != null && args.getPipeline() != null)
		{
			String customs = args.getPipeline().customSwitchUsage();
			if(!customs.equals(""))
			{
				rv += "\nCustom switches specific to the given pipeline configuration are:\n";
				rv += customs;
			}
		}
		return rv;
	}