001    package org.maltparser.parser.algorithm.nivre;
002    
003    import java.util.Stack;
004    
005    import org.maltparser.core.exception.MaltChainedException;
006    import org.maltparser.core.syntaxgraph.edge.Edge;
007    import org.maltparser.core.syntaxgraph.node.DependencyNode;
008    import org.maltparser.parser.ParserConfiguration;
009    import org.maltparser.parser.TransitionSystem;
010    import org.maltparser.parser.history.GuideUserHistory;
011    import org.maltparser.parser.history.History;
012    import org.maltparser.parser.history.action.ComplexDecisionAction;
013    import org.maltparser.parser.history.action.GuideUserAction;
014    import org.maltparser.parser.transition.TransitionTable;
015    /**
016     * @author Johan Hall
017     *
018     */
019    public class ArcStandard extends TransitionSystem {
020            protected static final int SHIFT = 1;
021            protected static final int RIGHTARC = 2;
022            protected static final int LEFTARC = 3;
023            
024            public ArcStandard() throws MaltChainedException {
025                    super();
026            }
027            
028            public void apply(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
029                    NivreConfig nivreConfig = (NivreConfig)config;
030                    Stack<DependencyNode> stack = nivreConfig.getStack();
031                    Stack<DependencyNode> input = nivreConfig.getInput();
032                    currentAction.getAction(actionContainers);
033                    Edge e = null;
034                    switch (transActionContainer.getActionCode()) {
035                    case LEFTARC:
036                            e = nivreConfig.getDependencyStructure().addDependencyEdge(input.peek().getIndex(), stack.peek().getIndex());
037                            addEdgeLabels(e);
038                            stack.pop();
039                            break;
040                    case RIGHTARC:
041                            e = nivreConfig.getDependencyStructure().addDependencyEdge(stack.peek().getIndex(), input.peek().getIndex());
042                            addEdgeLabels(e);
043                            input.pop();
044                            if (!stack.peek().isRoot()) {
045                                    input.push(stack.pop());        
046                            }
047                            break;
048                    default:
049                            stack.push(input.pop()); // SHIFT
050                            break;
051                    }
052            }
053            
054            public GuideUserAction getDeterministicAction(GuideUserHistory history, ParserConfiguration config) throws MaltChainedException {
055                    NivreConfig nivreConfig = (NivreConfig)config;
056                    if (nivreConfig.getRootHandling() != NivreConfig.NORMAL && nivreConfig.getStack().peek().isRoot()) {
057                            return updateActionContainers(history, ArcStandard.SHIFT, null);
058                    }
059                    return null;
060            }
061            
062            protected void addAvailableTransitionToTable(TransitionTable ttable) throws MaltChainedException {
063                    ttable.addTransition(SHIFT, "SH", false, null);
064                    ttable.addTransition(RIGHTARC, "RA", true, null);
065                    ttable.addTransition(LEFTARC, "LA", true, null);
066            }
067            
068            protected void initWithDefaultTransitions(GuideUserHistory history) throws MaltChainedException {
069                    GuideUserAction currentAction = new ComplexDecisionAction((History)history);
070                    
071                    transActionContainer.setAction(SHIFT);
072                    for (int i = 0; i < arcLabelActionContainers.length; i++) {
073                            arcLabelActionContainers[i].setAction(-1);
074                    }
075                    currentAction.addAction(actionContainers);
076            }
077            
078            public String getName() {
079                    return "nivrestandard";
080            }
081            
082            public boolean permissible(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
083                    currentAction.getAction(actionContainers);
084                    int trans = transActionContainer.getActionCode();
085                    if ((trans == LEFTARC || trans == RIGHTARC) && !isActionContainersLabeled()) {
086                            return false;
087                    }
088                    DependencyNode stackTop = ((NivreConfig)config).getStack().peek();
089                    if (((NivreConfig)config).getRootHandling() != NivreConfig.NORMAL && stackTop.isRoot() && trans != SHIFT) {
090                            return false;
091                    }
092                    if (trans == LEFTARC && stackTop.isRoot()) { 
093                            return false;
094                    }
095                    return true;
096            }
097            
098            public GuideUserAction defaultAction(GuideUserHistory history, ParserConfiguration configuration) throws MaltChainedException {
099                    return updateActionContainers(history, ArcStandard.SHIFT, null);
100            }
101    }