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.