package edu.stanford.nlp.parser.common; import java.io.FileFilter; import java.io.PrintStream; import java.util.regex.Pattern; import edu.stanford.nlp.io.NumberRangeFileFilter; import edu.stanford.nlp.io.NumberRangesFileFilter; import edu.stanford.nlp.util.Pair; import edu.stanford.nlp.util.Triple; /** * Utility methods or common blocks of code for dealing with parser * arguments, such as extracting Treebank information */ public class ArgUtils { private ArgUtils() {} // helper function public static int numSubArgs(String[] args, int index) { int i = index; while (i + 1 < args.length && args[i + 1].charAt(0) != '-') { i++; } return i - index; } public static void printArgs(String[] args, PrintStream ps) { ps.print("Parser invoked with arguments:"); for (String arg : args) { ps.print(' ' + arg); } ps.println(); } static final Pattern DOUBLE_PATTERN = Pattern.compile("[-]?[0-9]+[.][0-9]+"); public static Pair<String, FileFilter> getTreebankDescription(String[] args, int argIndex, String flag) { Triple<String, FileFilter, Double> description = getWeightedTreebankDescription(args, argIndex, flag); return Pair.makePair(description.first(), description.second()); } public static Triple<String, FileFilter, Double> getWeightedTreebankDescription(String[] args, int argIndex, String flag) { String path = null; FileFilter filter = null; Double weight = 1.0; // the next arguments are the treebank path and maybe the range for testing int numSubArgs = numSubArgs(args, argIndex); if (numSubArgs > 0 && numSubArgs < 4) { argIndex++; path = args[argIndex++]; boolean hasWeight = false; if (numSubArgs > 1 && DOUBLE_PATTERN.matcher(args[argIndex + numSubArgs - 2]).matches()) { weight = Double.parseDouble(args[argIndex + numSubArgs - 2]); hasWeight = true; numSubArgs--; } if (numSubArgs == 2) { filter = new NumberRangesFileFilter(args[argIndex++], true); } else if (numSubArgs == 3) { try { int low = Integer.parseInt(args[argIndex]); int high = Integer.parseInt(args[argIndex + 1]); filter = new NumberRangeFileFilter(low, high, true); argIndex += 2; } catch (NumberFormatException e) { // maybe it's a ranges expression? filter = new NumberRangesFileFilter(args[argIndex++], true); } } if (hasWeight) { argIndex++; } } else { throw new IllegalArgumentException("Bad arguments after " + flag); } return Triple.makeTriple(path, filter, weight); } }