package edu.stanford.nlp.sempre;
import com.google.common.base.Strings;
import fig.basic.Option;
import fig.basic.Utils;
/**
* Contains all the components (grammar, feature extractor, parser, parameters)
* needed for semantic parsing.
*
* @author Percy Liang
*/
public class Builder {
public static class Options {
@Option public String inParamsPath;
@Option public String executor = "JavaExecutor";
@Option public String valueEvaluator = "ExactValueEvaluator";
@Option public String parser = "BeamParser";
}
public static Options opts = new Options();
public Grammar grammar;
public Executor executor;
public ValueEvaluator valueEvaluator;
public FeatureExtractor extractor;
public Parser parser;
public Params params;
public void build() {
grammar = null;
executor = null;
valueEvaluator = null;
extractor = null;
parser = null;
params = null;
buildUnspecified();
}
public void buildUnspecified() {
// Grammar
if (grammar == null) {
grammar = new Grammar();
grammar.read();
grammar.write();
}
// Executor
if (executor == null)
executor = (Executor) Utils.newInstanceHard(SempreUtils.resolveClassName(opts.executor));
// Value evaluator
if (valueEvaluator == null)
valueEvaluator = (ValueEvaluator) Utils.newInstanceHard(SempreUtils.resolveClassName(opts.valueEvaluator));
// Feature extractor
if (extractor == null)
extractor = new FeatureExtractor(executor);
// Parser
if (parser == null)
parser = buildParser(new Parser.Spec(grammar, extractor, executor, valueEvaluator));
// Parameters
if (params == null) {
params = new Params();
if (!Strings.isNullOrEmpty(opts.inParamsPath))
params.read(opts.inParamsPath);
}
}
public static Parser buildParser(Parser.Spec spec) {
switch (opts.parser) {
case "BeamParser":
return new BeamParser(spec);
case "ReinforcementParser":
return new ReinforcementParser(spec);
case "FloatingParser":
return new FloatingParser(spec);
default:
// Try instantiating by name
try {
Class<?> parserClass = Class.forName(SempreUtils.resolveClassName(opts.parser));
return (Parser) parserClass.getConstructor(spec.getClass()).newInstance(spec);
} catch (ClassNotFoundException e1) {
throw new RuntimeException("Illegal parser: " + opts.parser);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error while instantiating parser: " + opts.parser + "\n" + e);
}
}
}
}