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 ArcEager extends TransitionSystem {
020 protected static final int SHIFT = 1;
021 protected static final int REDUCE = 2;
022 protected static final int RIGHTARC = 3;
023 protected static final int LEFTARC = 4;
024
025 public ArcEager() throws MaltChainedException {
026 super();
027 }
028
029 public void apply(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
030 final NivreConfig nivreConfig = (NivreConfig)config;
031 final Stack<DependencyNode> stack = nivreConfig.getStack();
032 final Stack<DependencyNode> input = nivreConfig.getInput();
033 currentAction.getAction(actionContainers);
034 Edge e = null;
035 switch (transActionContainer.getActionCode()) {
036 case LEFTARC:
037 e = nivreConfig.getDependencyStructure().addDependencyEdge(input.peek().getIndex(), stack.peek().getIndex());
038 addEdgeLabels(e);
039 stack.pop();
040 // doPropagation(e);
041 break;
042 case RIGHTARC:
043 e = nivreConfig.getDependencyStructure().addDependencyEdge(stack.peek().getIndex(), input.peek().getIndex());
044 addEdgeLabels(e);
045 stack.push(input.pop());
046 // doPropagation(e);
047 break;
048 case REDUCE:
049 stack.pop();
050 break;
051 default:
052 stack.push(input.pop());
053 break;
054 }
055 }
056
057 public GuideUserAction getDeterministicAction(GuideUserHistory history, ParserConfiguration config) throws MaltChainedException {
058 final NivreConfig nivreConfig = (NivreConfig)config;
059 if (!nivreConfig.isAllowRoot() && nivreConfig.getStack().peek().isRoot()) {
060 return updateActionContainers(history, ArcEager.SHIFT, null);
061 }
062 return null;
063 }
064
065 protected void addAvailableTransitionToTable(TransitionTable ttable) throws MaltChainedException {
066 ttable.addTransition(SHIFT, "SH", false, null);
067 ttable.addTransition(REDUCE, "RE", false, null);
068 ttable.addTransition(RIGHTARC, "RA", true, null);
069 ttable.addTransition(LEFTARC, "LA", true, null);
070 }
071
072 protected void initWithDefaultTransitions(GuideUserHistory history) throws MaltChainedException {
073 GuideUserAction currentAction = new ComplexDecisionAction((History)history);
074
075 transActionContainer.setAction(SHIFT);
076 transActionContainer.setAction(REDUCE);
077 for (int i = 0; i < arcLabelActionContainers.length; i++) {
078 arcLabelActionContainers[i].setAction(-1);
079 }
080 currentAction.addAction(actionContainers);
081 }
082
083 public String getName() {
084 return "nivreeager";
085 }
086
087 public boolean permissible(GuideUserAction currentAction, ParserConfiguration config) throws MaltChainedException {
088 currentAction.getAction(actionContainers);
089 final int trans = transActionContainer.getActionCode();
090 final DependencyNode stackPeek = ((NivreConfig)config).getStack().peek();
091 if ((trans == LEFTARC || trans == RIGHTARC) && !isActionContainersLabeled()) {
092 return false;
093 }
094 if ((trans == LEFTARC || trans == REDUCE) && stackPeek.isRoot()) {
095 return false;
096 }
097 if (trans == LEFTARC && stackPeek.hasHead()) {
098 return false;
099 }
100 if (trans == REDUCE && !stackPeek.hasHead() && !((NivreConfig)config).isAllowReduce()) {
101 return false;
102 }
103 return true;
104 }
105
106 public GuideUserAction defaultAction(GuideUserHistory history, ParserConfiguration configuration) throws MaltChainedException {
107 return updateActionContainers(history, ArcEager.SHIFT, null);
108 }
109 }