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.symbol.SymbolTable;
009 import org.maltparser.core.syntaxgraph.node.NonTerminalNode;
010 import org.maltparser.core.syntaxgraph.node.PhraseStructureNode;
011 /**
012 *
013 *
014 * @author Johan Hall
015 */
016 public class HeadRule extends ArrayList<PrioList> {
017 public static final long serialVersionUID = 8045568022124826323L;
018 protected HeadRules headRules;
019 protected SymbolTable table;
020 protected int symbolCode;
021 protected Direction defaultDirection;
022
023 public HeadRule(HeadRules headRules, String ruleSpec) throws MaltChainedException {
024 setHeadRules(headRules);
025 init(ruleSpec);
026 }
027
028 public void init(String ruleSpec) throws MaltChainedException {
029 String spec = ruleSpec.trim();
030 String[] items = spec.split("\t");
031 if (items.length != 3) {
032 throw new HeadRuleException("The specification of the head rule is not correct '"+ruleSpec+"'. ");
033 }
034
035 int index = items[0].indexOf(':');
036 if (index != -1) {
037 SymbolTable t = getDataFormatInstance().getSymbolTables().getSymbolTable(items[0].substring(0, index));
038 if (t == null) {
039 throw new HeadRuleException("The specification of the head rule is not correct '"+ruleSpec+"'. ");
040 }
041 setTable(t);
042 setSymbolCode(table.addSymbol(items[0].substring(index+1)));
043 } else {
044 throw new HeadRuleException("The specification of the head rule is not correct '"+ruleSpec+"'. ");
045 }
046 if (items[1].charAt(0) == 'r') {
047 defaultDirection = Direction.RIGHT;
048 } else if (items[1].charAt(0) == 'l') {
049 defaultDirection = Direction.LEFT;
050 } else {
051 throw new HeadRuleException("Could not determine the default direction of the head rule '"+ruleSpec+"'. ");
052 }
053 if (items[2].length() > 1) {
054 if (items[2].indexOf(';') == -1) {
055 add(new PrioList(this, items[2]));
056 } else {
057 String[] lists = items[2].split(";");
058 for (int i = 0; i < lists.length; i++) {
059 add(new PrioList(this, lists[i]));
060 }
061 }
062 }
063 }
064
065 public PhraseStructureNode getHeadChild(NonTerminalNode nt) throws MaltChainedException {
066 PhraseStructureNode headChild = null;
067 for (int i = 0; i < size(); i++) {
068 headChild = get(i).getHeadChild(nt);
069 if (headChild != null) {
070 break;
071 }
072 }
073 return headChild;
074 }
075
076 public SymbolTable getTable() {
077 return table;
078 }
079
080 public void setTable(SymbolTable table) {
081 this.table = table;
082 }
083
084 public int getSymbolCode() {
085 return symbolCode;
086 }
087
088 public void setSymbolCode(int symbolCode) {
089 this.symbolCode = symbolCode;
090 }
091
092 public String getSymbolString() throws MaltChainedException {
093 return table.getSymbolCodeToString(symbolCode);
094 }
095
096 public Direction getDefaultDirection() {
097 return defaultDirection;
098 }
099
100 public void setDefaultDirection(Direction direction) {
101 this.defaultDirection = direction;
102 }
103
104 public Logger getLogger() {
105 return headRules.getLogger();
106 }
107
108 public void setHeadRules(HeadRules headRules) {
109 this.headRules = headRules;
110 }
111
112 public DataFormatInstance getDataFormatInstance() {
113 return headRules.getDataFormatInstance();
114 }
115
116 public String toString() {
117 final StringBuilder sb = new StringBuilder();
118 sb.append(table.getName());
119 sb.append(':');
120 try {
121 sb.append(getSymbolString());
122 } catch (MaltChainedException e) {
123 if (getLogger().isDebugEnabled()) {
124 getLogger().debug("",e);
125 } else {
126 getLogger().error(e.getMessageChain());
127 }
128 }
129 sb.append('\t');
130 if (defaultDirection == Direction.LEFT) {
131 sb.append('l');
132 } else if (defaultDirection == Direction.RIGHT) {
133 sb.append('r');
134 }
135 sb.append('\t');
136 if (size() == 0) {
137 sb.append('*');
138 } else {
139 for (int i = 0; i < size(); i++) {
140 sb.append(get(i));
141 if (i < size()-1) {
142 sb.append(';');
143 }
144 }
145 }
146 return sb.toString();
147 }
148 }