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    }