1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package name.angoca.db2sa.core.lexical;
30
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.StringTokenizer;
34
35 import name.angoca.db2sa.Configurator;
36 import name.angoca.db2sa.Constants;
37 import name.angoca.db2sa.core.ReturnOptions;
38 import name.angoca.db2sa.core.lexical.exceptions.InvalidTokenException;
39 import name.angoca.db2sa.core.syntax.GraphAnswer;
40 import name.angoca.db2sa.core.syntax.ImplSyntaxAnalyzer;
41 import name.angoca.db2sa.core.syntax.graph.exception.InvalidGraphException;
42
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 public final class ImplLexicalAnalyzer extends AbstractLexicalAnalyzer {
67
68
69
70
71 private static final Logger LOGGER = LoggerFactory
72 .getLogger(ImplLexicalAnalyzer.class);
73
74
75
76
77 private static ImplLexicalAnalyzer s_instance;
78
79
80
81
82 private final String m_delimiters;
83
84
85
86
87
88
89
90 private ImplLexicalAnalyzer() throws InvalidGraphException {
91 super();
92 this.m_delimiters = Configurator.getInstance().getProperty(
93 Constants.DELIMITERS);
94
95 ImplSyntaxAnalyzer.getInstance();
96 }
97
98
99
100
101
102
103
104
105
106 public static ImplLexicalAnalyzer
107 throws InvalidGraphException {
108
109 synchronized (ImplLexicalAnalyzer.class) {
110 if (ImplLexicalAnalyzer.s_instance == null) {
111 ImplLexicalAnalyzer.LOGGER
112 .debug("Creating ImplLexicalAnalyzer instance");
113 ImplLexicalAnalyzer.s_instance = new ImplLexicalAnalyzer();
114 }
115 }
116 return ImplLexicalAnalyzer.s_instance;
117 }
118
119
120
121
122 public static void destroyInstance() {
123 ImplLexicalAnalyzer.LOGGER
124 .debug("Destroying ImplLexicalAnalyzer instance");
125
126 ImplSyntaxAnalyzer.destroyInstance();
127 ImplLexicalAnalyzer.s_instance = null;
128 }
129
130
131
132
133
134
135
136
137 @Override
138 public ReturnOptions
139 throws InvalidGraphException {
140
141 if (ImplLexicalAnalyzer.LOGGER.isDebugEnabled()) {
142 ImplLexicalAnalyzer.LOGGER.debug(
143 "Entering to lexical analyzer: '{}'",
144 phrase);
145 }
146
147
148 String newPhrase = phrase.trim();
149
150 final StringTokenizer tokenizer = new StringTokenizer(newPhrase,
151 this.m_delimiters, true);
152
153 final List<Token> tokens = new ArrayList<Token>(tokenizer.countTokens());
154 String currentToken;
155 try {
156
157
158
159 while (tokenizer.hasMoreTokens()) {
160 currentToken = tokenizer.nextToken();
161 if (!(currentToken.equals(" "))) {
162 final Token token = new Token(currentToken);
163 tokens.add(token);
164 ImplLexicalAnalyzer.LOGGER.debug(
165 "Token: {{}}", currentToken);
166 }
167 }
168 } catch (InvalidTokenException e) {
169
170 ImplLexicalAnalyzer.LOGGER.error(e.getMessage());
171 }
172
173 final GraphAnswer answer = ImplSyntaxAnalyzer.getInstance().getOptions(
174 tokens);
175
176
177
178
179
180
181
182 newPhrase = this.replaceLastToken(newPhrase, tokens, answer);
183
184 final int sizePhrases = answer.getPhrases().size();
185 final int sizeOptions = answer.getOptions().size();
186 String[] setOfPhrases = new String[sizePhrases];
187 if (sizePhrases == 1 && sizeOptions == 0) {
188 setOfPhrases = new String[] {};
189 } else {
190 for (int j = 0; j < sizePhrases; j += 1) {
191 final Token token = answer.getPhrases().get(j);
192 setOfPhrases[j] = token.getToken();
193 }
194
195 }
196 final String[] setOfOptions = new String[sizeOptions];
197 for (int j = 0; j < sizeOptions; j += 1) {
198 final Token token = answer.getOptions().get(j);
199 setOfOptions[j] = token.getToken();
200 }
201
202 if (ImplLexicalAnalyzer.LOGGER.isDebugEnabled()) {
203 ImplLexicalAnalyzer.LOGGER.debug("{} : {}",
204 answer.getPhrases().toString(), answer.getOptions()
205 .toString());
206 }
207
208
209
210 final ReturnOptions ret = new ReturnOptions(newPhrase, setOfPhrases,
211 setOfOptions);
212 return ret;
213 }
214
215
216
217
218
219
220
221
222
223
224
225
226
227 protected String replaceLastToken(final String phrase,
228 final List<Token> tokens, final GraphAnswer answer) {
229 String newPhrase = phrase;
230 final int lastIndexPhrase = tokens.size() - 1;
231
232 if (answer.getOptions().size() == 0 && answer.getPhrases().size() == 1
233 && lastIndexPhrase >= 0) {
234
235 final String lastTokenPhrase = tokens.get(lastIndexPhrase)
236 .getToken();
237 final int lastToken = phrase.lastIndexOf(lastTokenPhrase);
238 newPhrase = phrase.substring(0, lastToken);
239
240 final String lastTokenGraph = answer.getPhrases().get(0).getToken();
241 newPhrase = newPhrase.concat(lastTokenGraph);
242 }
243 return newPhrase;
244 }
245 }