package org.maltparserx.parser;
import org.maltparserx.core.exception.MaltChainedException;
import org.maltparserx.core.syntaxgraph.DependencyStructure;
import org.maltparserx.parser.guide.ClassifierGuide;
import org.maltparserx.parser.guide.SingleGuide;
import org.maltparserx.parser.history.GuideHistory;
import org.maltparserx.parser.history.action.GuideDecision;
import org.maltparserx.parser.history.action.GuideUserAction;
/**
* @author Johan Hall
*
*/
public class DeterministicParser extends Parser {
private int parseCount;
public DeterministicParser(DependencyParserConfig manager) throws MaltChainedException {
super(manager);
setManager(manager);
initParserState(1);
((SingleMalt)manager).addRegistry(org.maltparserx.parser.Algorithm.class, this);
setGuide(new SingleGuide(manager, (GuideHistory)parserState.getHistory(), ClassifierGuide.GuideMode.CLASSIFY));
}
public DependencyStructure parse(DependencyStructure parseDependencyGraph) throws MaltChainedException {
if (diagnostics == true) {
return parseDiagnostic(parseDependencyGraph);
}
parserState.clear();
parserState.initialize(parseDependencyGraph);
currentParserConfiguration = parserState.getConfiguration();
parseCount++;
TransitionSystem ts = parserState.getTransitionSystem();
while (!parserState.isTerminalState()) {
GuideUserAction action = ts.getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
if (action == null) {
action = predict();
}
parserState.apply(action);
}
copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
copyDynamicInput(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
parseDependencyGraph.linkAllTreesToRoot();
return parseDependencyGraph;
}
private DependencyStructure parseDiagnostic(DependencyStructure parseDependencyGraph) throws MaltChainedException {
parserState.clear();
parserState.initialize(parseDependencyGraph);
currentParserConfiguration = parserState.getConfiguration();
parseCount++;
if (diagnostics == true) {
writeToDiaFile(parseCount + "");
}
while (!parserState.isTerminalState()) {
GuideUserAction action = parserState.getTransitionSystem().getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
if (action == null) {
action = predict();
} else if (diagnostics == true) {
writeToDiaFile(" *");
}
if (diagnostics == true) {
writeToDiaFile(" " + parserState.getTransitionSystem().getActionString(action));
}
parserState.apply(action);
}
copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
copyDynamicInput(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
parseDependencyGraph.linkAllTreesToRoot();
if (diagnostics == true) {
writeToDiaFile("\n");
}
return parseDependencyGraph;
}
private GuideUserAction predict() throws MaltChainedException {
GuideUserAction currentAction = parserState.getHistory().getEmptyGuideUserAction();
try {
classifierGuide.predict((GuideDecision)currentAction);
while (!parserState.permissible(currentAction)) {
if (classifierGuide.predictFromKBestList((GuideDecision)currentAction) == false) {
currentAction = getParserState().getTransitionSystem().defaultAction(parserState.getHistory(), currentParserConfiguration);
break;
}
}
} catch (NullPointerException e) {
throw new MaltChainedException("The guide cannot be found. ", e);
}
return currentAction;
}
public void terminate() throws MaltChainedException {
if (diagnostics == true) {
closeDiaWriter();
}
}
}