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 }