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 // 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 NivreConfig nivreConfig = (NivreConfig)config; 059 if (nivreConfig.getRootHandling() != NivreConfig.NORMAL && 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 int trans = transActionContainer.getActionCode(); 090 DependencyNode stackPeek = ((NivreConfig)config).getStack().peek(); 091 int rootHandling = ((NivreConfig)config).getRootHandling(); 092 if ((trans == LEFTARC || trans == RIGHTARC) && !isActionContainersLabeled()) { 093 return false; 094 } 095 if ((trans == LEFTARC || trans == REDUCE) && stackPeek.isRoot()) { 096 return false; 097 } 098 if (trans == LEFTARC && stackPeek.hasHead()) { 099 return false; 100 } 101 if (trans == REDUCE && !stackPeek.hasHead() && rootHandling == NivreConfig.STRICT) { 102 return false; 103 } 104 return true; 105 } 106 107 public GuideUserAction defaultAction(GuideUserHistory history, ParserConfiguration configuration) throws MaltChainedException { 108 return updateActionContainers(history, ArcEager.SHIFT, null); 109 } 110 }