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