Skip to content

Method: create(int)

1: package de.fhdw.wtf.dsl.scanner.modelScanner;
2:
3: import java.util.ArrayList;
4: import java.util.List;
5:
6: import de.fhdw.wtf.common.token.Position;
7: import de.fhdw.wtf.dsl.scanner.common.CreatingDelta;
8: import de.fhdw.wtf.dsl.scanner.common.Delta;
9: import de.fhdw.wtf.dsl.scanner.common.InputMatcher;
10: import de.fhdw.wtf.dsl.scanner.common.LoopDelta;
11: import de.fhdw.wtf.dsl.scanner.common.Scanner;
12: import de.fhdw.wtf.dsl.scanner.common.ScannerState;
13: import de.fhdw.wtf.dsl.scanner.common.StateCreater;
14: import de.fhdw.wtf.dsl.scanner.common.StateMatcher;
15: import de.fhdw.wtf.dsl.scanner.modelScanner.state.CommentState;
16: import de.fhdw.wtf.dsl.scanner.modelScanner.state.InvalidState;
17: import de.fhdw.wtf.dsl.scanner.modelScanner.state.KeywordIdentifierState;
18: import de.fhdw.wtf.dsl.scanner.modelScanner.state.ScannerStateVisitor;
19: import de.fhdw.wtf.dsl.scanner.modelScanner.state.SymbolState;
20: import de.fhdw.wtf.dsl.scanner.modelScanner.state.WhitespaceState;
21:
22: /**
23: * {@link Scanner} implementation for the model language of WTF.
24: */
25: public final class ModelDslScanner extends Scanner {
26:         
27:         /**
28:          * Default number of whitespaces, who representing a tabulator.
29:          */
30:         private static final int DEFAULT_TAB_WIDTH = 2;
31:         
32:         /**
33:          * List of allowed Transitions between ScannerStates.
34:          */
35:         private final List<Delta> deltas;
36:         
37:         /**
38:          * Creates a new ModelDslScanner-Object with the given tabulator width.
39:          *
40:          * @param tabulatorWidth
41:          * the number of whitespaces representing a tabulator
42:          *
43:          * @return a new instance of ModelDslScanner
44:          */
45:         public static ModelDslScanner create(final int tabulatorWidth) {
46:                 return new ModelDslScanner(tabulatorWidth);
47:         }
48:         
49:         /**
50:          * Creates a new ModelDslScanner-Object, where the tabulator width is default.
51:          *
52:          * @return a new instance of ModelDslScanner
53:          */
54:         public static ModelDslScanner create() {
55:                 return new ModelDslScanner(DEFAULT_TAB_WIDTH);
56:         }
57:         
58:         /**
59:          * Creates a new ModelDslScanner-Object with the given tabulator width.
60:          *
61:          * @param tabulatorWidth
62:          * the number of whitespaces representing a tabulator
63:          */
64:         private ModelDslScanner(final int tabulatorWidth) {
65:                 super(tabulatorWidth);
66:                 this.deltas = new ArrayList<>();
67:                 this.initDelta();
68:         }
69:         
70:         @Override
71:         protected List<Delta> getDeltas() {
72:                 return this.deltas;
73:         }
74:         
75:         @Override
76:         protected ScannerState getStartState() {
77:                 return SymbolState.create(Position.create("", 1, 1, 0));
78:         }
79:         
80:         @Override
81:         protected ScannerState getDefaultState(final Position position) {
82:                 return InvalidState.create(position);
83:         }
84:         
85:         /**
86:          * Builds the delta-function for the 'Automata' the scanner uses.
87:          */
88:         private void initDelta() {
89:                 final StateCreater commentCreater = new StateCreater() {
90:                         @Override
91:                         public ScannerState create(final Position position) {
92:                                 return CommentState.create(position);
93:                         }
94:                 };
95:                 final StateCreater whitespaceCreater = new StateCreater() {
96:                         @Override
97:                         public ScannerState create(final Position position) {
98:                                 return WhitespaceState.create(position);
99:                         }
100:                 };
101:                 final StateCreater keyIdentCreater = new StateCreater() {
102:                         @Override
103:                         public ScannerState create(final Position position) {
104:                                 return KeywordIdentifierState.create(position);
105:                         }
106:                 };
107:                 final StateCreater symbolCreater = new StateCreater() {
108:                         @Override
109:                         public ScannerState create(final Position position) {
110:                                 return SymbolState.create(position);
111:                         }
112:                 };
113:                 final InputMatcher keyIdentPrefixMatcher = new InputMatcher() {
114:                         @Override
115:                         public boolean match(final Character c) {
116:                                 return Character.isLetter(c) || c == '_';
117:                         }
118:                 };
119:                 final InputMatcher keyIdentMatcher = new InputMatcher() {
120:                         @Override
121:                         public boolean match(final Character c) {
122:                                 return Character.isLetterOrDigit(c) || c == '_';
123:                         }
124:                 };
125:                 final InputMatcher whitespaceMatcher = new InputMatcher() {
126:                         @Override
127:                         public boolean match(final Character c) {
128:                                 return Character.isWhitespace(c);
129:                         }
130:                 };
131:                 
132:                 final InputMatcher invalidMatcher = new InputMatcher() {
133:                         @Override
134:                         public boolean match(final Character c) {
135:                                 return InvalidState.isInValid(c);
136:                         }
137:                 };
138:                 final InputMatcher symbolMatcher = new InputMatcher() {
139:                         @Override
140:                         public boolean match(final Character c) {
141:                                 return SymbolState.isSymbol(c);
142:                         }
143:                 };
144:                 
145:                 final InputMatcher commentBeginMatcher = new InputMatcher() {
146:                         @Override
147:                         public boolean match(final Character c) {
148:                                 return c == CommentState.COMMENT_OPEN;
149:                         }
150:                 };
151:                 final InputMatcher commentMatcher = new InputMatcher() {
152:                         @Override
153:                         public boolean match(final Character c) {
154:                                 return c != CommentState.COMMENT_CLOSE;
155:                         }
156:                 };
157:                 final InputMatcher commentEndMatcher = new InputMatcher() {
158:                         @Override
159:                         public boolean match(final Character c) {
160:                                 return c == CommentState.COMMENT_CLOSE;
161:                         }
162:                 };
163:                 final StateMatcher exceptCommentState = new StateMatcher() {
164:                         @Override
165:                         public boolean match(final ScannerState state) {
166:                                 return state.accept(new ScannerStateVisitor() {
167:                                         @Override
168:                                         public boolean handleWhitespaceState() {
169:                                                 return true;
170:                                         }
171:                                         
172:                                         @Override
173:                                         public boolean handleSymbolState() {
174:                                                 return true;
175:                                         }
176:                                         
177:                                         @Override
178:                                         public boolean handleKeywordIdentifierState() {
179:                                                 return true;
180:                                         }
181:                                         
182:                                         @Override
183:                                         public boolean handleInvalidState() {
184:                                                 return true;
185:                                         }
186:                                         
187:                                         @Override
188:                                         public boolean handleCommentState() {
189:                                                 return false;
190:                                         }
191:                                 });
192:                         }
193:                 };
194:                 final StateMatcher exceptCommentAndSymbolState = new StateMatcher() {
195:                         @Override
196:                         public boolean match(final ScannerState state) {
197:                                 return state.accept(new ScannerStateVisitor() {
198:                                         @Override
199:                                         public boolean handleWhitespaceState() {
200:                                                 return true;
201:                                         }
202:                                         
203:                                         @Override
204:                                         public boolean handleSymbolState() {
205:                                                 return false;
206:                                         }
207:                                         
208:                                         @Override
209:                                         public boolean handleKeywordIdentifierState() {
210:                                                 return true;
211:                                         }
212:                                         
213:                                         @Override
214:                                         public boolean handleInvalidState() {
215:                                                 return true;
216:                                         }
217:                                         
218:                                         @Override
219:                                         public boolean handleCommentState() {
220:                                                 return false;
221:                                         }
222:                                 });
223:                         }
224:                 };
225:                 final StateMatcher exceptCommentAndKeyIdentState = new StateMatcher() {
226:                         @Override
227:                         public boolean match(final ScannerState state) {
228:                                 return state.accept(new ScannerStateVisitor() {
229:                                         @Override
230:                                         public boolean handleWhitespaceState() {
231:                                                 return true;
232:                                         }
233:                                         
234:                                         @Override
235:                                         public boolean handleSymbolState() {
236:                                                 return true;
237:                                         }
238:                                         
239:                                         @Override
240:                                         public boolean handleKeywordIdentifierState() {
241:                                                 return false;
242:                                         }
243:                                         
244:                                         @Override
245:                                         public boolean handleInvalidState() {
246:                                                 return true;
247:                                         }
248:                                         
249:                                         @Override
250:                                         public boolean handleCommentState() {
251:                                                 return false;
252:                                         }
253:                                 });
254:                         }
255:                 };
256:                 final StateMatcher exceptCommentAndWhitespaceState = new StateMatcher() {
257:                         @Override
258:                         public boolean match(final ScannerState state) {
259:                                 return state.accept(new ScannerStateVisitor() {
260:                                         @Override
261:                                         public boolean handleWhitespaceState() {
262:                                                 return false;
263:                                         }
264:                                         
265:                                         @Override
266:                                         public boolean handleSymbolState() {
267:                                                 return true;
268:                                         }
269:                                         
270:                                         @Override
271:                                         public boolean handleKeywordIdentifierState() {
272:                                                 return true;
273:                                         }
274:                                         
275:                                         @Override
276:                                         public boolean handleInvalidState() {
277:                                                 return true;
278:                                         }
279:                                         
280:                                         @Override
281:                                         public boolean handleCommentState() {
282:                                                 return false;
283:                                         }
284:                                 });
285:                         }
286:                 };
287:                 final StateMatcher whitespaceState = new StateMatcher() {
288:                         @Override
289:                         public boolean match(final ScannerState state) {
290:                                 return state.accept(new ScannerStateVisitor() {
291:                                         @Override
292:                                         public boolean handleWhitespaceState() {
293:                                                 return true;
294:                                         }
295:                                         
296:                                         @Override
297:                                         public boolean handleSymbolState() {
298:                                                 return false;
299:                                         }
300:                                         
301:                                         @Override
302:                                         public boolean handleKeywordIdentifierState() {
303:                                                 return false;
304:                                         }
305:                                         
306:                                         @Override
307:                                         public boolean handleInvalidState() {
308:                                                 return false;
309:                                         }
310:                                         
311:                                         @Override
312:                                         public boolean handleCommentState() {
313:                                                 return false;
314:                                         }
315:                                 });
316:                         }
317:                 };
318:                 final StateMatcher invalidState = new StateMatcher() {
319:                         @Override
320:                         public boolean match(final ScannerState state) {
321:                                 return state.accept(new ScannerStateVisitor() {
322:                                         @Override
323:                                         public boolean handleWhitespaceState() {
324:                                                 return false;
325:                                         }
326:                                         
327:                                         @Override
328:                                         public boolean handleSymbolState() {
329:                                                 return false;
330:                                         }
331:                                         
332:                                         @Override
333:                                         public boolean handleKeywordIdentifierState() {
334:                                                 return false;
335:                                         }
336:                                         
337:                                         @Override
338:                                         public boolean handleInvalidState() {
339:                                                 return true;
340:                                         }
341:                                         
342:                                         @Override
343:                                         public boolean handleCommentState() {
344:                                                 return false;
345:                                         }
346:                                 });
347:                         }
348:                 };
349:                 final StateMatcher keyIdentState = new StateMatcher() {
350:                         @Override
351:                         public boolean match(final ScannerState state) {
352:                                 return state.accept(new ScannerStateVisitor() {
353:                                         @Override
354:                                         public boolean handleWhitespaceState() {
355:                                                 return false;
356:                                         }
357:                                         
358:                                         @Override
359:                                         public boolean handleSymbolState() {
360:                                                 return false;
361:                                         }
362:                                         
363:                                         @Override
364:                                         public boolean handleKeywordIdentifierState() {
365:                                                 return true;
366:                                         }
367:                                         
368:                                         @Override
369:                                         public boolean handleInvalidState() {
370:                                                 return false;
371:                                         }
372:                                         
373:                                         @Override
374:                                         public boolean handleCommentState() {
375:                                                 return false;
376:                                         }
377:                                 });
378:                         }
379:                 };
380:                 final StateMatcher commentState = new StateMatcher() {
381:                         @Override
382:                         public boolean match(final ScannerState state) {
383:                                 return state.accept(new ScannerStateVisitor() {
384:                                         @Override
385:                                         public boolean handleWhitespaceState() {
386:                                                 return false;
387:                                         }
388:                                         
389:                                         @Override
390:                                         public boolean handleSymbolState() {
391:                                                 return false;
392:                                         }
393:                                         
394:                                         @Override
395:                                         public boolean handleKeywordIdentifierState() {
396:                                                 return false;
397:                                         }
398:                                         
399:                                         @Override
400:                                         public boolean handleInvalidState() {
401:                                                 return false;
402:                                         }
403:                                         
404:                                         @Override
405:                                         public boolean handleCommentState() {
406:                                                 return true;
407:                                         }
408:                                 });
409:                         }
410:                 };
411:                 final StateMatcher symbolState = new StateMatcher() {
412:                         @Override
413:                         public boolean match(final ScannerState state) {
414:                                 return state.accept(new ScannerStateVisitor() {
415:                                         @Override
416:                                         public boolean handleWhitespaceState() {
417:                                                 return false;
418:                                         }
419:                                         
420:                                         @Override
421:                                         public boolean handleSymbolState() {
422:                                                 return true;
423:                                         }
424:                                         
425:                                         @Override
426:                                         public boolean handleKeywordIdentifierState() {
427:                                                 return false;
428:                                         }
429:                                         
430:                                         @Override
431:                                         public boolean handleInvalidState() {
432:                                                 return false;
433:                                         }
434:                                         
435:                                         @Override
436:                                         public boolean handleCommentState() {
437:                                                 return false;
438:                                         }
439:                                 });
440:                         }
441:                 };
442:                 this.getDeltas().add(CreatingDelta.create(exceptCommentAndSymbolState, symbolMatcher, symbolCreater));
443:                 this.getDeltas().add(
444:                                 CreatingDelta.create(exceptCommentAndKeyIdentState, keyIdentPrefixMatcher, keyIdentCreater));
445:                 this.getDeltas().add(
446:                                 CreatingDelta.create(exceptCommentAndWhitespaceState, whitespaceMatcher, whitespaceCreater));
447:                 this.getDeltas().add(LoopDelta.create(invalidState, invalidMatcher));
448:                 this.getDeltas().add(LoopDelta.create(whitespaceState, whitespaceMatcher));
449:                 this.getDeltas().add(LoopDelta.create(keyIdentState, keyIdentMatcher));
450:                 this.getDeltas().add(LoopDelta.create(symbolState, symbolMatcher));
451:                 this.getDeltas().add(CreatingDelta.create(exceptCommentState, commentBeginMatcher, commentCreater));
452:                 this.getDeltas().add(CreatingDelta.create(commentState, commentEndMatcher, symbolCreater));
453:                 this.getDeltas().add(LoopDelta.create(commentState, commentMatcher));
454:         }
455:         
456: }