001 package org.maltparser.parser.history.container;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.symbol.Table;
005 /**
006 *
007 * @author Johan Hall
008 **/
009 public class TableContainer {
010 public enum RelationToNextDecision { COMBINED, SEQUANTIAL, BRANCHED, SWITCHED, NONE }
011 protected int cachedCode;
012 protected final StringBuilder cachedSymbol;
013 protected Table table;
014 protected String name;
015 private RelationToNextDecision relationToNextDecision;
016
017 public TableContainer(Table table, String name, char decisionSeparator) {
018 this.table = table;
019 this.name = name;
020 switch (decisionSeparator) {
021 case '+':
022 this.relationToNextDecision = RelationToNextDecision.COMBINED;
023 break;
024 case ',':
025 this.relationToNextDecision = RelationToNextDecision.SEQUANTIAL;
026 break;
027 case ';':
028 this.relationToNextDecision = RelationToNextDecision.BRANCHED;
029 break;
030 case '#':
031 this.relationToNextDecision = RelationToNextDecision.BRANCHED;
032 break;
033 case '?':
034 this.relationToNextDecision = RelationToNextDecision.SWITCHED;
035 break;
036 default:
037 this.relationToNextDecision = RelationToNextDecision.NONE;
038 }
039 cachedSymbol = new StringBuilder();
040 cachedCode = -1;
041 }
042
043
044 public void clearCache() {
045 cachedCode = -1;
046 cachedSymbol.setLength(0);
047 }
048
049 public String getSymbol(int code) throws MaltChainedException {
050 if (code < 0 && !containCode(code)) {
051 clearCache();
052 return null;
053 }
054 if (cachedCode != code) {
055 clearCache();
056 cachedCode = code;
057 cachedSymbol.append(table.getSymbolCodeToString(cachedCode));
058 }
059 return cachedSymbol.toString();
060 }
061
062 public int getCode(String symbol) throws MaltChainedException {
063 if (cachedSymbol == null || !cachedSymbol.equals(symbol)) {
064 clearCache();
065 cachedSymbol.append(symbol);
066 cachedCode = table.getSymbolStringToCode(symbol);
067 }
068 return cachedCode;
069 }
070
071 public boolean containCode(int code) throws MaltChainedException {
072 if (cachedCode != code) {
073 clearCache();
074 cachedSymbol.append(table.getSymbolCodeToString(code));
075 if (cachedSymbol == null) {
076 return false;
077 }
078 cachedCode = code;
079 }
080 return true;
081 }
082
083 public boolean containSymbol(String symbol) throws MaltChainedException {
084 if (cachedSymbol == null || !cachedSymbol.equals(symbol)) {
085 clearCache();
086 cachedCode = table.getSymbolStringToCode(symbol);
087 if (cachedCode < 0) {
088 return false;
089 }
090 cachedSymbol.append(symbol);
091 }
092 return true;
093 }
094
095 public boolean continueWithNextDecision(int code) throws MaltChainedException {
096 if (table instanceof DecisionPropertyTable) {
097 return ((DecisionPropertyTable)table).continueWithNextDecision(code);
098 }
099 return true;
100 }
101
102 public boolean continueWithNextDecision(String symbol) throws MaltChainedException {
103 if (table instanceof DecisionPropertyTable) {
104 return ((DecisionPropertyTable)table).continueWithNextDecision(symbol);
105 }
106 return true;
107 }
108
109 public Table getTable() {
110 return table;
111 }
112
113 public String getTableName() {
114 return table != null?table.getName():null;
115 }
116
117 public String getTableContainerName() {
118 return name;
119 }
120
121 public RelationToNextDecision getRelationToNextDecision() {
122 return relationToNextDecision;
123 }
124
125
126 protected void setTable(Table table) {
127 this.table = table;
128 }
129
130 protected void setName(String name) {
131 this.name = name;
132 }
133
134 public int size() {
135 return table.size();
136 }
137
138 public String toString() {
139 final StringBuilder sb = new StringBuilder();
140 sb.append(name);
141 sb.append(" -> " );
142 sb.append(cachedSymbol);
143 sb.append(" = ");
144 sb.append(cachedCode);
145 return sb.toString();
146 }
147 }