code: package edu.berkeley.nlp.PCFGLA;
  
  import java.util.Map;
  
  import edu.berkeley.nlp.PCFGLA.smoothing.SmoothAcrossParentBits;
  import edu.berkeley.nlp.PCFGLA.smoothing.Smoother;
  import edu.berkeley.nlp.util.CommandLineUtils;
  
  public class GrammarSmoother {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) {
  		if (args.length < 1) {
  			System.out
  					.println("usage: java GrammarSmoother \n"
  							+ "\t\t  -i       Input File for Grammar (Required)\n"
  							+ "\t\t  -o       Output File for Smoothed Grammar (Required)\n"
  							+ "\t\t  -smooth  Type of grammar smoothing used.  This takes the maximum likelihood rule\n"
  							+ "               probabilities and smooths them with each other.  Current options are\n"
  							+ "               'NoSmoothing', 'SmoothAcrossParentSubstate', and 'SmoothAcrossParentBits'.\n"
  							+ "\t\t  -grsm    Grammar smoothing parameter, in range [0,1].  (Default: 0.1)\n");
  			System.exit(2);
  		}
  		// provide feedback on command-line arguments
  		System.out.print("Running with arguments:  ");
  		for (String arg : args) {
  			System.out.print(" '" + arg + "'");
  		}
  		System.out.println("");
  
  		// parse the input arguments
  		Map<String, String> input = CommandLineUtils
  				.simpleCommandLineParser(args);
  
  		String outFileName = CommandLineUtils.getValueOrUseDefault(input, "-o",
  				null);
  		String inFileName = CommandLineUtils.getValueOrUseDefault(input, "-i",
  				null);
  		System.out.println("Loading grammar from " + inFileName + ".");
  
  		ParserData pData = ParserData.Load(inFileName);
  		if (pData == null) {
  			System.out.println("Failed to load grammar from file" + inFileName
  					+ ".");
  			System.exit(1);
  		}
  
  		Grammar gr = pData.getGrammar();
  
  		// double grammarSmoothing =
  		// Double.parseDouble(CommandLineUtils.getValueOrUseDefault(input,
  		// "-grsm","0.1"));
  		// String smootherStr = CommandLineUtils.getValueOrUseDefault(input,
  		// "-smooth", "NoSmoothing");
  
  		Smoother grSmoother = new SmoothAcrossParentBits(0.01, gr.splitTrees);
  		Smoother lexSmoother = new SmoothAcrossParentBits(0.1, gr.splitTrees);
  
  		gr.setSmoother(grSmoother);
  		// gr.smooth();
  		pData.gr = gr;
  		Lexicon lex = pData.getLexicon();
  		lex.setSmoother(lexSmoother);
  		pData.lex = lex;
  		if (pData.Save(outFileName))
  			System.out.println("Saving successful.");
  		else
  			System.out.println("Saving failed!");
  
  		System.exit(0);
  
  	}
  
  }
  