1: ================================================================================
2:
3: Smalltalk defineClass: #SynapseScannerState
4: superclass: #{Core.Object}
5: indexedType: #none
6: private: false
7: instanceVariableNames: 'inputBlock isTerminal isUnknown symbol terminalSymbol '
8: classInstanceVariableNames: ''
9: imports: ''
10: category: ''
11:
12: ================================================================================
13:
14: SynapseScannerState method for 'initialize state'
15:
16: _initial
17:
18: ^self
19: symbol: #initial;
20: terminalSymbol: #initial;
21: inputBlock:
22: [:aCharacter :nextCharacter |
23: | aSymbol aBlock |
24: aSymbol := #unknown.
25: aBlock := [:anAssociate | anAssociate key = aCharacter ifTrue: [aSymbol := anAssociate value]].
26: (OrderedCollection new)
27: add: $= -> #GETS;
28: add: $; -> #SEMICOLON;
29: add: $. -> #PERIOD;
30: add: $( -> #LPAR;
31: add: $) -> #RPAR;
32: add: $, -> #COMMA;
33: add: $" -> #string_quoted;
34: add: $/ -> #comment_slash;
35: add: $t -> #idOrTo_t;
36: add: $s -> #idOrSend_s;
37: add: $_ -> #ID;
38: do: aBlock.
39: (aSymbol = #unknown and: [aCharacter isAlphabetic]) ifTrue: [aSymbol := #ID].
40: aSymbol yourself];
41: isTerminal: false;
42: yourself
43:
44: ------------------------------------------------------------
45:
46: SynapseScannerState method for 'initialize-release'
47:
48: _state: aSymbol
49:
50: | mapCollection |
51: mapCollection := self class mapCollection.
52: mapCollection do: [:aMap | aMap key = aSymbol ifTrue: [^self perform: aMap value]].
53: ^self perform: #unknown
54:
55: ------------------------------------------------------------
56:
57: SynapseScannerState method for 'initialize state'
58:
59: comma
60:
61: ^self
62: symbol: #COMMA;
63: terminalSymbol: #COMMA;
64: inputBlock: [:aCharacter :nextCharacter | #unknown];
65: isTerminal: true;
66: yourself
67:
68: ------------------------------------------------------------
69:
70: SynapseScannerState method for 'initialize state'
71:
72: comment
73:
74: ^self
75: symbol: #COMMENT;
76: terminalSymbol: #COMMENT;
77: inputBlock: [:aCharacter :nextCharacter | #unknown];
78: isTerminal: true;
79: yourself
80:
81: ------------------------------------------------------------
82:
83: SynapseScannerState method for 'initialize state'
84:
85: comment_asterisk
86:
87: ^self
88: symbol: #comment_asterisk;
89: terminalSymbol: #unacceptable;
90: inputBlock:
91: [:aCharacter :nextCharacter |
92: | aSymbol |
93: aSymbol := #unknown.
94: aCharacter = $* ifTrue: [aSymbol := #comment_asterisk].
95: aCharacter = $/ ifTrue: [aSymbol := #COMMENT].
96: (aCharacter ~= $* and: [aCharacter ~= $/])
97: ifTrue: [aSymbol := #comment_firstAsterisk].
98: aSymbol yourself];
99: isTerminal: false;
100: yourself
101:
102: ------------------------------------------------------------
103:
104: SynapseScannerState method for 'initialize state'
105:
106: comment_firstAsterisk
107:
108: ^self
109: symbol: #comment_firstAsterisk;
110: terminalSymbol: #unacceptable;
111: inputBlock:
112: [:aCharacter :nextCharacter |
113: | aSymbol |
114: aSymbol := #unknown.
115: aCharacter = $* ifTrue: [aSymbol := #comment_asterisk].
116: aCharacter ~= $* ifTrue: [aSymbol := #comment_firstAsterisk].
117: aSymbol yourself];
118: isTerminal: false;
119: yourself
120:
121: ------------------------------------------------------------
122:
123: SynapseScannerState method for 'initialize state'
124:
125: comment_slash
126:
127: ^self
128: symbol: #comment_slash;
129: terminalSymbol: #unacceptable;
130: inputBlock:
131: [:aCharacter :nextCharacter |
132: | aSymbol |
133: aSymbol := #unknown.
134: aCharacter = $* ifTrue: [aSymbol := #comment_firstAsterisk].
135: aSymbol yourself];
136: isTerminal: false;
137: yourself
138:
139: ------------------------------------------------------------
140:
141: SynapseScannerState method for 'initialize state'
142:
143: gets
144:
145: ^self
146: symbol: #GETS;
147: terminalSymbol: #GETS;
148: inputBlock: [:aCharacter :nextCharacter | #unknown];
149: isTerminal: true;
150: yourself
151:
152: ------------------------------------------------------------
153:
154: SynapseScannerState method for 'initialize state'
155:
156: id
157:
158: ^self
159: symbol: #ID;
160: terminalSymbol: #ID;
161: inputBlock:
162: [:aCharacter :nextCharacter |
163: | aSymbol |
164: aSymbol := #unknown.
165: aCharacter = $_ ifTrue: [aSymbol := #ID].
166: aCharacter isAlphaNumeric ifTrue: [aSymbol := #ID].
167: aSymbol yourself];
168: isTerminal: true;
169: yourself
170:
171: ------------------------------------------------------------
172:
173: SynapseScannerState method for 'initialize state'
174:
175: idOrSend_s
176:
177: ^self
178: symbol: #idOrSend_s;
179: terminalSymbol: #ID;
180: inputBlock:
181: [:aCharacter :nextCharacter |
182: | aSymbol |
183: aSymbol := #unknown.
184: aCharacter = $e ifTrue: [aSymbol := #idOrSend_se].
185: (aSymbol = #unknown and: [aCharacter = $_ or: [aCharacter isAlphaNumeric]])
186: ifTrue: [aSymbol := #ID].
187: aSymbol yourself];
188: isTerminal: true;
189: yourself
190:
191: ------------------------------------------------------------
192:
193: SynapseScannerState method for 'initialize state'
194:
195: idOrSend_se
196:
197: ^self
198: symbol: #idOrSend_se;
199: terminalSymbol: #ID;
200: inputBlock:
201: [:aCharacter :nextCharacter |
202: | aSymbol |
203: aSymbol := #unknown.
204: aCharacter = $n ifTrue: [aSymbol := #idOrSend_sen].
205: (aSymbol = #unknown and: [aCharacter = $_ or: [aCharacter isAlphaNumeric]])
206: ifTrue: [aSymbol := #ID].
207: aSymbol yourself];
208: isTerminal: true;
209: yourself
210:
211: ------------------------------------------------------------
212:
213: SynapseScannerState method for 'initialize state'
214:
215: idOrSend_sen
216:
217: ^self
218: symbol: #idOrSend_sen;
219: terminalSymbol: #ID;
220: inputBlock:
221: [:aCharacter :nextCharacter |
222: | aSymbol |
223: aSymbol := #unknown.
224: aCharacter = $d ifTrue: [aSymbol := #idOrSend_send].
225: (aSymbol = #unknown and: [aCharacter = $_ or: [aCharacter isAlphaNumeric]])
226: ifTrue: [aSymbol := #ID].
227: aSymbol yourself];
228: isTerminal: true;
229: yourself
230:
231: ------------------------------------------------------------
232:
233: SynapseScannerState method for 'initialize state'
234:
235: idOrSend_send
236:
237: ^self
238: symbol: #idOrSend_send;
239: terminalSymbol: #ID;
240: inputBlock:
241: [:aCharacter :nextCharacter |
242: | aSymbol |
243: aSymbol := #unknown.
244: aCharacter = $: ifTrue: [aSymbol := #SEND].
245: aCharacter = $_ ifTrue: [aSymbol := #ID].
246: aCharacter isAlphaNumeric ifTrue: [aSymbol := #ID].
247: aSymbol yourself];
248: isTerminal: true;
249: yourself
250:
251: ------------------------------------------------------------
252:
253: SynapseScannerState method for 'initialize state'
254:
255: idOrTo_t
256:
257: ^self
258: symbol: #idOrTo_t;
259: terminalSymbol: #ID;
260: inputBlock:
261: [:aCharacter :nextCharacter |
262: | aSymbol |
263: aSymbol := #unknown.
264: aCharacter = $o ifTrue: [aSymbol := #idOrTo_to].
265: (aSymbol = #unknown and: [aCharacter = $_ or: [aCharacter isAlphaNumeric]])
266: ifTrue: [aSymbol := #ID].
267: aSymbol yourself];
268: isTerminal: true;
269: yourself
270:
271: ------------------------------------------------------------
272:
273: SynapseScannerState method for 'initialize state'
274:
275: idOrTo_to
276:
277: ^self
278: symbol: #idOrTo_to;
279: terminalSymbol: #ID;
280: inputBlock:
281: [:aCharacter :nextCharacter |
282: | aSymbol |
283: aSymbol := #unknown.
284: aCharacter = $: ifTrue: [aSymbol := #TO].
285: aCharacter = $_ ifTrue: [aSymbol := #ID].
286: aCharacter isAlphaNumeric ifTrue: [aSymbol := #ID].
287: aSymbol yourself];
288: isTerminal: true;
289: yourself
290:
291: ------------------------------------------------------------
292:
293: SynapseScannerState method for 'initialize state'
294:
295: initial
296:
297: ^self
298: symbol: #initial;
299: terminalSymbol: #initial;
300: inputBlock:
301: [:aCharacter :nextCharacter |
302: | aSymbol |
303: aSymbol := #unknown.
304: aCharacter = $= ifTrue: [aSymbol := #GETS].
305: aCharacter = $; ifTrue: [aSymbol := #SEMICOLON].
306: aCharacter = $. ifTrue: [aSymbol := #PERIOD].
307: aCharacter = $( ifTrue: [aSymbol := #LPAR].
308: aCharacter = $) ifTrue: [aSymbol := #RPAR].
309: aCharacter = $, ifTrue: [aSymbol := #COMMA].
310: aCharacter = $" ifTrue: [aSymbol := #string_quoted].
311: aCharacter = $/ ifTrue: [aSymbol := #comment_slash].
312: aCharacter = $t ifTrue: [aSymbol := #idOrTo_t].
313: aCharacter = $s ifTrue: [aSymbol := #idOrSend_s].
314: aCharacter = $_ ifTrue: [aSymbol := #ID].
315: aCharacter isSeparator ifTrue: [aSymbol := #initial].
316: (aSymbol = #unknown and: [aCharacter isAlphabetic]) ifTrue: [aSymbol := #ID].
317: aSymbol yourself];
318: isTerminal: false;
319: yourself
320:
321: ------------------------------------------------------------
322:
323: SynapseScannerState method for 'testing'
324:
325: input: aCharacter withNextCharacter: nextCharacter
326:
327: ^self inputBlock value: aCharacter value: nextCharacter
328:
329: ------------------------------------------------------------
330:
331: SynapseScannerState method for 'accessing'
332:
333: inputBlock
334:
335: inputBlock ifNil: [inputBlock := [:aCharacter | #unknown]].
336: ^inputBlock
337:
338: ------------------------------------------------------------
339:
340: SynapseScannerState method for 'accessing'
341:
342: inputBlock: aBlock
343:
344: inputBlock := aBlock
345:
346: ------------------------------------------------------------
347:
348: SynapseScannerState method for 'accessing'
349:
350: isTerminal
351:
352: ^isTerminal
353:
354: ------------------------------------------------------------
355:
356: SynapseScannerState method for 'accessing'
357:
358: isTerminal: aBoolean
359:
360: isTerminal := aBoolean
361:
362: ------------------------------------------------------------
363:
364: SynapseScannerState method for 'accessing'
365:
366: isUnknown
367:
368: ^self symbol = #unknown
369:
370: ------------------------------------------------------------
371:
372: SynapseScannerState method for 'initialize state'
373:
374: lpar
375:
376: ^self
377: symbol: #LPAR;
378: terminalSymbol: #LPAR;
379: inputBlock: [:aCharacter :nextCharacter | #unknown];
380: isTerminal: true;
381: yourself
382:
383: ------------------------------------------------------------
384:
385: SynapseScannerState method for 'initialize state'
386:
387: period
388:
389: ^self
390: symbol: #PERIOD;
391: terminalSymbol: #PERIOD;
392: inputBlock: [:aCharacter :nextCharacter | #unknown];
393: isTerminal: true;
394: yourself
395:
396: ------------------------------------------------------------
397:
398: SynapseScannerState method for 'printing'
399:
400: printString
401:
402: | aStream |
403: aStream := String new writeStream.
404: aStream
405: nextPutAll: self class name;
406: nextPutAll: ' state: ';
407: nextPutAll: self symbol printString;
408: yourself.
409: ^aStream contents
410:
411: ------------------------------------------------------------
412:
413: SynapseScannerState method for 'initialize state'
414:
415: rpar
416:
417: ^self
418: symbol: #RPAR;
419: terminalSymbol: #RPAR;
420: inputBlock: [:aCharacter :nextCharacter | #unknown];
421: isTerminal: true;
422: yourself
423:
424: ------------------------------------------------------------
425:
426: SynapseScannerState method for 'initialize state'
427:
428: semicolon
429:
430: ^self
431: symbol: #SEMICOLON;
432: terminalSymbol: #SEMICOLON;
433: inputBlock: [:aCharacter :nextCharacter | #unknown];
434: isTerminal: true;
435: yourself
436:
437: ------------------------------------------------------------
438:
439: SynapseScannerState method for 'initialize state'
440:
441: send
442:
443: ^self
444: symbol: #SEND;
445: terminalSymbol: #SEND;
446: inputBlock: [:aCharacter :nextCharacter | #unknown];
447: isTerminal: true;
448: yourself
449:
450: ------------------------------------------------------------
451:
452: SynapseScannerState method for 'initialize-release'
453:
454: state: aSymbol
455:
456: | aSelector |
457: aSelector := self class selectorDictionary at: aSymbol ifAbsent: [#unknown].
458: ^self perform: aSelector
459:
460: ------------------------------------------------------------
461:
462: SynapseScannerState method for 'initialize state'
463:
464: string
465:
466: ^self
467: symbol: #STRING;
468: terminalSymbol: #STRING;
469: inputBlock: [:aCharacter :nextCharacter | #unknown];
470: isTerminal: true;
471: yourself
472:
473: ------------------------------------------------------------
474:
475: SynapseScannerState method for 'initialize state'
476:
477: string_escaped
478:
479: ^self
480: symbol: #string_escaped;
481: terminalSymbol: #unacceptable;
482: inputBlock: [:aCharacter :nextCharacter | #string_quoted];
483: isTerminal: false;
484: yourself
485:
486: ------------------------------------------------------------
487:
488: SynapseScannerState method for 'initialize state'
489:
490: string_quoted
491:
492: ^self
493: symbol: #string_quoted;
494: terminalSymbol: #unacceptable;
495: inputBlock:
496: [:aCharacter :nextCharacter |
497: | aSymbol |
498: aCharacter = $"
499: ifTrue:
500: [nextCharacter = $"
501: ifTrue: [aSymbol := #string_escaped]
502: ifFalse: [aSymbol := #STRING]]
503: ifFalse: [aSymbol := #string_quoted].
504: aSymbol yourself];
505: isTerminal: false;
506: yourself
507:
508: ------------------------------------------------------------
509:
510: SynapseScannerState method for 'accessing'
511:
512: symbol
513:
514: ^symbol
515:
516: ------------------------------------------------------------
517:
518: SynapseScannerState method for 'accessing'
519:
520: symbol: aSymbol
521:
522: symbol := aSymbol
523:
524: ------------------------------------------------------------
525:
526: SynapseScannerState method for 'accessing'
527:
528: terminalSymbol
529:
530: ^terminalSymbol
531:
532: ------------------------------------------------------------
533:
534: SynapseScannerState method for 'accessing'
535:
536: terminalSymbol: aSymbol
537:
538: terminalSymbol := aSymbol
539:
540: ------------------------------------------------------------
541:
542: SynapseScannerState method for 'initialize state'
543:
544: to
545:
546: ^self
547: symbol: #TO;
548: terminalSymbol: #TO;
549: inputBlock: [:aCharacter :nextCharacter | #unknown];
550: isTerminal: true;
551: yourself
552:
553: ------------------------------------------------------------
554:
555: SynapseScannerState method for 'initialize state'
556:
557: unknown
558:
559: ^self
560: symbol: #unknown;
561: terminalSymbol: #unknown;
562: inputBlock: [:aCharacter :nextCharacter | #unknown];
563: isTerminal: false;
564: yourself
565:
566: ================================================================================
567:
568: Smalltalk.SynapseScannerState class
569: instanceVariableNames: ''
570:
571: ================================================================================
572:
573: SynapseScannerState class method for 'defaults'
574:
575: mapCollection
576:
577: ^(OrderedCollection new)
578: add: #initial -> #initial;
579: add: #ID -> #id;
580: add: #idOrTo_t -> #idOrTo_t;
581: add: #idOrTo_to -> #idOrTo_to;
582: add: #TO -> #to;
583: add: #idOrSend_s -> #idOrSend_s;
584: add: #idOrSend_se -> #idOrSend_se;
585: add: #idOrSend_sen -> #idOrSend_sen;
586: add: #idOrSend_send -> #idOrSend_send;
587: add: #SEND -> #send;
588: add: #GETS -> #gets;
589: add: #SEMICOLON -> #semicolon;
590: add: #PERIOD -> #period;
591: add: #LPAR -> #lpar;
592: add: #RPAR -> #rpar;
593: add: #COMMA -> #comma;
594: add: #string_quoted -> #string_quoted;
595: add: #string_escaped -> #string_escaped;
596: add: #STRING -> #string;
597: add: #comment_slash -> #comment_slash;
598: add: #comment_firstAsterisk -> #comment_firstAsterisk;
599: add: #comment_asterisk -> #comment_asterisk;
600: add: #COMMENT -> #comment;
601: yourself
602:
603: ------------------------------------------------------------
604:
605: SynapseScannerState class method for 'defaults'
606:
607: selectorDictionary
608:
609: ^(Dictionary new)
610: add: #initial -> #initial;
611: add: #ID -> #id;
612: add: #idOrTo_t -> #idOrTo_t;
613: add: #idOrTo_to -> #idOrTo_to;
614: add: #TO -> #to;
615: add: #idOrSend_s -> #idOrSend_s;
616: add: #idOrSend_se -> #idOrSend_se;
617: add: #idOrSend_sen -> #idOrSend_sen;
618: add: #idOrSend_send -> #idOrSend_send;
619: add: #SEND -> #send;
620: add: #GETS -> #gets;
621: add: #SEMICOLON -> #semicolon;
622: add: #PERIOD -> #period;
623: add: #LPAR -> #lpar;
624: add: #RPAR -> #rpar;
625: add: #COMMA -> #comma;
626: add: #string_quoted -> #string_quoted;
627: add: #string_escaped -> #string_escaped;
628: add: #STRING -> #string;
629: add: #comment_slash -> #comment_slash;
630: add: #comment_firstAsterisk -> #comment_firstAsterisk;
631: add: #comment_asterisk -> #comment_asterisk;
632: add: #COMMENT -> #comment;
633: yourself
634:
635: ------------------------------------------------------------
636:
637: SynapseScannerState class method for 'instance creation'
638:
639: state: aSymbol
640:
641: ^(self new)
642: state: aSymbol;
643: yourself
644:
645: ================================================================================
This document was generated by KSU.TextDoclet on 2013/02/22 at 01:01:17.