001 package org.maltparser.parser;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.syntaxgraph.DependencyStructure;
005
006 import org.maltparser.parser.guide.ClassifierGuide;
007 import org.maltparser.parser.guide.SingleGuide;
008 import org.maltparser.parser.history.GuideHistory;
009 import org.maltparser.parser.history.action.GuideDecision;
010 import org.maltparser.parser.history.action.GuideUserAction;
011 /**
012 * @author Johan Hall
013 *
014 */
015 public class DeterministicParser extends Parser {
016 private int parseCount;
017
018 public DeterministicParser(DependencyParserConfig manager) throws MaltChainedException {
019 super(manager);
020 setManager(manager);
021 initParserState(1);
022 ((SingleMalt)manager).addRegistry(org.maltparser.parser.Algorithm.class, this);
023 setGuide(new SingleGuide(manager, (GuideHistory)parserState.getHistory(), ClassifierGuide.GuideMode.CLASSIFY));
024 }
025
026 public DependencyStructure parse(DependencyStructure parseDependencyGraph) throws MaltChainedException {
027 parserState.clear();
028 parserState.initialize(parseDependencyGraph);
029 currentParserConfiguration = parserState.getConfiguration();
030 parseCount++;
031 if (diagnostics == true) {
032 writeToDiaFile(parseCount + "");
033 }
034 while (!parserState.isTerminalState()) {
035 GuideUserAction action = parserState.getTransitionSystem().getDeterministicAction(parserState.getHistory(), currentParserConfiguration);
036 if (action == null) {
037 action = predict();
038 } else if (diagnostics == true) {
039 writeToDiaFile(" *");
040 }
041 if (diagnostics == true) {
042 writeToDiaFile(" " + parserState.getTransitionSystem().getActionString(action));
043 }
044 parserState.apply(action);
045 }
046 copyEdges(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
047 copyDynamicInput(currentParserConfiguration.getDependencyGraph(), parseDependencyGraph);
048 parseDependencyGraph.linkAllTreesToRoot();
049 if (diagnostics == true) {
050 writeToDiaFile("\n");
051 }
052 return parseDependencyGraph;
053 }
054
055 private GuideUserAction predict() throws MaltChainedException {
056 GuideUserAction currentAction = parserState.getHistory().getEmptyGuideUserAction();
057 try {
058 classifierGuide.predict((GuideDecision)currentAction);
059 while (!parserState.permissible(currentAction)) {
060 if (classifierGuide.predictFromKBestList((GuideDecision)currentAction) == false) {
061 currentAction = getParserState().getTransitionSystem().defaultAction(parserState.getHistory(), currentParserConfiguration);
062 break;
063 }
064 }
065 } catch (NullPointerException e) {
066 throw new MaltChainedException("The guide cannot be found. ", e);
067 }
068 return currentAction;
069 }
070
071 public void terminate() throws MaltChainedException {
072 if (diagnostics == true) {
073 closeDiaWriter();
074 }
075 }
076 }