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