001 package org.maltparser.core.syntaxgraph.headrules; 002 003 import java.util.ArrayList; 004 005 import org.apache.log4j.Logger; 006 import org.maltparser.core.exception.MaltChainedException; 007 import org.maltparser.core.io.dataformat.DataFormatInstance; 008 import org.maltparser.core.syntaxgraph.node.NonTerminalNode; 009 import org.maltparser.core.syntaxgraph.node.PhraseStructureNode; 010 /** 011 * 012 * 013 * @author Johan Hall 014 */ 015 public class PrioList extends ArrayList<PrioSet> { 016 public static final long serialVersionUID = 8045568022124816323L; 017 protected HeadRule headRule; 018 protected Direction direction; 019 020 public PrioList(HeadRule headRule, String listSpec) throws MaltChainedException { 021 setHeadRule(headRule); 022 init(listSpec); 023 } 024 025 public void init(String listSpec) throws MaltChainedException { 026 String spec = listSpec.trim(); 027 if (spec.length() < 8) { 028 throw new HeadRuleException("The specification of the priority list is not correct '"+listSpec+"'. "); 029 } 030 if (spec.charAt(0) == 'r') { 031 direction = Direction.RIGHT; 032 } else if (spec.charAt(0) == 'l') { 033 direction = Direction.LEFT; 034 } else { 035 throw new HeadRuleException("Could not determine the direction of the priority list '"+listSpec+"'. "); 036 } 037 if (spec.charAt(1) == '[' && spec.charAt(spec.length()-1) == ']') { 038 String[] items = spec.substring(2,spec.length()-1).split(" "); 039 for (int i=0; i<items.length; i++) { 040 add(new PrioSet(this, items[i])); 041 } 042 } else { 043 throw new HeadRuleException("The specification of the priority list is not correct '"+listSpec+"'. "); 044 } 045 } 046 047 public PhraseStructureNode getHeadChild(NonTerminalNode nt) throws MaltChainedException { 048 PhraseStructureNode headChild = null; 049 for (int i = 0, n = size(); i < n; i++) { 050 headChild = get(i).getHeadChild(nt, direction); 051 if (headChild != null) { 052 break; 053 } 054 } 055 return headChild; 056 } 057 058 public Logger getLogger() { 059 return headRule.getLogger(); 060 } 061 062 public DataFormatInstance getDataFormatInstance() { 063 return headRule.getDataFormatInstance(); 064 } 065 066 public HeadRule getHeadRule() { 067 return headRule; 068 } 069 070 public void setHeadRule(HeadRule headRule) { 071 this.headRule = headRule; 072 } 073 074 public boolean equals(Object obj) { 075 if (this == obj) 076 return true; 077 if (obj == null) 078 return false; 079 if (getClass() != obj.getClass()) 080 return false; 081 return super.equals(obj); 082 } 083 084 public int hashCode() { 085 return super.hashCode(); 086 } 087 088 public String toString() { 089 final StringBuilder sb = new StringBuilder(); 090 if (direction == Direction.LEFT) { 091 sb.append("l["); 092 } else if (direction == Direction.RIGHT) { 093 sb.append("r["); 094 } 095 for (PrioSet set : this) { 096 sb.append(set); 097 sb.append(' '); 098 } 099 if (sb.length() != 0) { 100 sb.setLength(sb.length()-1); 101 } 102 sb.append("]"); 103 return sb.toString(); 104 } 105 106 107 }