1: ================================================================================
  2: 
  3: Smalltalk defineClass: #SynapseScanner
  4:     superclass: #{Core.Object}
  5:     indexedType: #none
  6:     private: false
  7:     instanceVariableNames: 'scanStream tokenCollection transitionTable symbolCollection tokenCollectionWithSymbol '
  8:     classInstanceVariableNames: ''
  9:     imports: ''
 10:     category: ''
 11: 
 12: ================================================================================
 13: 
 14: SynapseScanner method for 'private'
 15: 
 16: _scan
 17:     "This is old 'STRING' type. See the document #10 and #39."
 18: 
 19:     | aStream currentState |
 20:     aStream := String new writeStream.
 21:     currentState := self transitionTable at: #initial.
 22:     [self peekChar isNil not] whileTrue: 
 23:             [| aCharacter nextState |
 24:             aCharacter := self peekChar.
 25:             nextState := self transition: currentState with: aCharacter.
 26:             nextState isUnknown
 27:                 ifTrue: 
 28:                     [currentState isTerminal
 29:                         ifTrue: 
 30:                             [self intern: (self class defaultTokenClass string: aStream contents
 31:                                         symbol: currentState terminalSymbol).
 32:                             currentState := self transitionTable at: #initial.
 33:                             aStream := String new writeStream]
 34:                         ifFalse: 
 35:                             [self scanError: 'Scan error near ' , currentState symbol printString
 36:                                 character: aCharacter]]
 37:                 ifFalse: 
 38:                     [self nextChar.
 39:                     currentState := nextState.
 40:                     (aCharacter isSeparator and: [currentState symbol = #initial])
 41:                         ifFalse: [aStream nextPut: aCharacter]]].
 42:     currentState isTerminal
 43:         ifTrue: 
 44:             [self intern: (self class defaultTokenClass string: aStream contents
 45:                         symbol: currentState terminalSymbol)]
 46:         ifFalse: 
 47:             [currentState symbol = #initial
 48:                 ifFalse: [self scanError: 'Scan error near ' , aStream contents character: nil]]
 49: 
 50: ------------------------------------------------------------
 51: 
 52: SynapseScanner method for 'initialize-release'
 53: 
 54: initialize
 55: 
 56:     scanStream := nil.
 57:     tokenCollection := nil.
 58:     transitionTable := nil
 59: 
 60: ------------------------------------------------------------
 61: 
 62: SynapseScanner method for 'private'
 63: 
 64: intern: aToken
 65: 
 66:     self tokenCollection add: aToken
 67: 
 68: ------------------------------------------------------------
 69: 
 70: SynapseScanner method for 'private'
 71: 
 72: nextChar
 73: 
 74:     ^self scanStream next
 75: 
 76: ------------------------------------------------------------
 77: 
 78: SynapseScanner method for 'private'
 79: 
 80: peekChar
 81: 
 82:     ^self scanStream peek
 83: 
 84: ------------------------------------------------------------
 85: 
 86: SynapseScanner method for 'private'
 87: 
 88: scan
 89:     "This 'scan' can Lookahead 1 character."
 90: 
 91:     | aStream currentState |
 92:     aStream := String new writeStream.
 93:     currentState := self transitionTable at: #initial.
 94:     [self peekChar isNil not] whileTrue: 
 95:             [| aCharacter nextCharacter nextState |
 96:             aCharacter := self nextChar.
 97:             nextCharacter := self peekChar.
 98:             nextState := self
 99:                         transition: currentState
100:                         with: aCharacter
101:                         lookahead: nextCharacter.
102:             nextState isUnknown
103:                 ifTrue: 
104:                     [currentState isTerminal
105:                         ifTrue: 
106:                             [self intern: (self class defaultTokenClass string: aStream contents
107:                                         symbol: currentState terminalSymbol).
108:                             aStream := String new writeStream.
109:                             aCharacter isSeparator ifFalse: [aStream nextPut: aCharacter].
110:                             currentState := self transitionTable at: #initial.
111:                             currentState := self
112:                                         transition: currentState
113:                                         with: aCharacter
114:                                         lookahead: nextCharacter]
115:                         ifFalse: 
116:                             [self scanError: 'Scan error near ' , currentState symbol printString
117:                                 character: aCharacter]]
118:                 ifFalse: 
119:                     [currentState := nextState.
120:                     (aCharacter isSeparator and: [currentState symbol = #initial])
121:                         ifFalse: [aStream nextPut: aCharacter]]].
122:     currentState isTerminal
123:         ifTrue: 
124:             [self intern: (self class defaultTokenClass string: aStream contents
125:                         symbol: currentState terminalSymbol)]
126:         ifFalse: 
127:             [currentState symbol = #initial
128:                 ifFalse: [self scanError: 'Scan error near ' , aStream contents character: nil]]
129: 
130: ------------------------------------------------------------
131: 
132: SynapseScanner method for 'error handling'
133: 
134: scanError: messageString
135: 
136:     self error: messageString
137: 
138: ------------------------------------------------------------
139: 
140: SynapseScanner method for 'error handling'
141: 
142: scanError: messageString character: aCharacter
143: 
144:     | aStream |
145:     aStream := String new writeStream.
146:     aStream nextPutAll: messageString.
147:     aCharacter
148:         ifNotNil: 
149:             [aStream
150:                 nextPutAll: ' Near ''';
151:                 nextPut: aCharacter;
152:                 nextPutAll: '''';
153:                 yourself].
154:     aStream nextPutAll: '.'.
155:     self scanError: aStream contents
156: 
157: ------------------------------------------------------------
158: 
159: SynapseScanner method for 'initialize-release'
160: 
161: scanOn: aStream
162: 
163:     self
164:         scanStream: aStream;
165:         scan;
166:         yourself
167: 
168: ------------------------------------------------------------
169: 
170: SynapseScanner method for 'accessing'
171: 
172: scanStream
173: 
174:     scanStream ifNil: [scanStream := ReadStream on: String new].
175:     ^scanStream
176: 
177: ------------------------------------------------------------
178: 
179: SynapseScanner method for 'accessing'
180: 
181: scanStream: aStream
182: 
183:     scanStream := aStream
184: 
185: ------------------------------------------------------------
186: 
187: SynapseScanner method for 'accessing'
188: 
189: tokenCollection
190: 
191:     tokenCollection ifNil: [tokenCollection := OrderedCollection new].
192:     ^tokenCollection
193: 
194: ------------------------------------------------------------
195: 
196: SynapseScanner method for 'private-scanning'
197: 
198: transition: currentState with: aCharacter
199:     "This is for old 'scan' method."
200: 
201:     | aState nextSymbol nextState |
202:     aState := self transitionTable at: currentState symbol.
203:     nextSymbol := aState input: aCharacter.
204:     nextState := self transitionTable at: nextSymbol.
205:     ^nextState
206: 
207: ------------------------------------------------------------
208: 
209: SynapseScanner method for 'private-scanning'
210: 
211: transition: currentState with: aCharacter lookahead: nextCharacter
212: 
213:     | aState nextSymbol nextState |
214:     aState := self transitionTable at: currentState symbol.
215:     nextSymbol := aState input: aCharacter withNextCharacter: nextCharacter.
216:     nextState := self transitionTable at: nextSymbol.
217:     ^nextState
218: 
219: ------------------------------------------------------------
220: 
221: SynapseScanner method for 'accessing'
222: 
223: transitionTable
224: 
225:     transitionTable ifNil: [transitionTable := self class defaultTableClass new].
226:     ^transitionTable
227: 
228: ================================================================================
229: 
230: Smalltalk.SynapseScanner class
231:     instanceVariableNames: ''
232: 
233: ================================================================================
234: 
235: SynapseScanner class method for 'defaults'
236: 
237: defaultTableClass
238: 
239:     ^KSU.SynapseScannerTable
240: 
241: ------------------------------------------------------------
242: 
243: SynapseScanner class method for 'defaults'
244: 
245: defaultTokenClass
246: 
247:     ^KSU.SynapseToken
248: 
249: ------------------------------------------------------------
250: 
251: SynapseScanner class method for 'examples'
252: 
253: example1
254:     "KSU.SynapseScanner example1."
255: 
256:     | aScanner |
257:     aScanner := KSU.SynapseScanner
258:                 scan: 'aFile=File("/path/to/File");aFile to: aFile.name;'.
259:     ^aScanner
260: 
261: ------------------------------------------------------------
262: 
263: SynapseScanner class method for 'examples'
264: 
265: example10
266:     "KSU.SynapseScanner example10."
267: 
268:     | aScanner |
269:     aScanner := KSU.SynapseScanner scan: '"hog""e".'.
270:     ^aScanner
271: 
272: ------------------------------------------------------------
273: 
274: SynapseScanner class method for 'examples'
275: 
276: example11
277:     "KSU.SynapseScanner example11."
278: 
279:     | aScanner |
280:     aScanner := KSU.SynapseScanner scan: '"hog""e"'.
281:     ^aScanner
282: 
283: ------------------------------------------------------------
284: 
285: SynapseScanner class method for 'examples'
286: 
287: example2
288:     "KSU.SynapseScanner example2."
289: 
290:     | aScanner |
291:     aScanner := KSU.SynapseScanner scan: 'xx = F("abc"); y to: z;'.
292:     ^aScanner
293: 
294: ------------------------------------------------------------
295: 
296: SynapseScanner class method for 'examples'
297: 
298: example3
299:     "KSU.SynapseScanner example3."
300: 
301:     | aScanner |
302:     aScanner := KSU.SynapseScanner
303:                 scan: 'sourceFile = File("/path/to/sourceFile");
304: headerFile = File("/path/to/headerFile");'.
305:     ^aScanner
306: 
307: ------------------------------------------------------------
308: 
309: SynapseScanner class method for 'examples'
310: 
311: example4
312:     "KSU.SynapseScanner example4."
313: 
314:     | aScanner |
315:     aScanner := KSU.SynapseScanner scan: 'x=F();."jo few";;'.
316:     ^aScanner
317: 
318: ------------------------------------------------------------
319: 
320: SynapseScanner class method for 'examples'
321: 
322: example5
323:     "KSU.SynapseScanner example5."
324: 
325:     | aScanner |
326:     aScanner := KSU.SynapseScanner
327:                 scan: 'sourceFile = File("/path/to/sourceFile");
328: headerFile = File("/path/to/headerFile");
329: metrics1 = Metrics("/path/to/metrics1", "value1", "value2");
330: metrics2 = Metrics("/path/to/metrics2");
331: metrics3 = Metrics("/path/to/metrics3");
332: metrics4 = Metrics("/path/to/metrics4");
333: transcript = Transcript();
334: transcript2 = Transcript("transcript2");
335: 
336: /*** ほげ ***//*** ほげ ***/
337: 
338: sourceFile
339:     to: metrics1
340:     to: metrics4.inputA
341:     to: transcript;
342: metrics1
343:     to: metrics4.inputB;
344: sourceFile
345:     to: metrics2.source
346:     send: outputA to: metrics4.inputC;
347: metrics2.outputB
348:     to: metrics3
349:     send: outputA to: metrics4.inputD;
350: metrics3.outputB
351:     to: transcript;
352: metrics3
353:     send: outputB to: transcript2;'.
354:     ^aScanner
355: 
356: ------------------------------------------------------------
357: 
358: SynapseScanner class method for 'examples'
359: 
360: example6
361:     "KSU.SynapseScanner example6."
362: 
363:     | aScanner |
364:     aScanner := KSU.SynapseScanner scan: 'to = send();'.
365:     ^aScanner
366: 
367: ------------------------------------------------------------
368: 
369: SynapseScanner class method for 'examples'
370: 
371: example7
372:     "KSU.SynapseScanner example7."
373: 
374:     | aScanner |
375:     aScanner := KSU.SynapseScanner
376:                 scan: 'transcript = Transcript("hoge");
377: transcript send: output to: transcript.input;'.
378:     ^aScanner
379: 
380: ------------------------------------------------------------
381: 
382: SynapseScanner class method for 'examples'
383: 
384: example8
385:     "KSU.SynapseScanner example8."
386: 
387:     | aScanner |
388:     aScanner := KSU.SynapseScanner scan: 'transcript
389:   
390: '.
391:     ^aScanner
392: 
393: ------------------------------------------------------------
394: 
395: SynapseScanner class method for 'examples'
396: 
397: example9
398:     "KSU.SynapseScanner example9."
399: 
400:     | aScanner |
401:     aScanner := KSU.SynapseScanner scan: 'hoge."hoge'.
402:     ^aScanner
403: 
404: ------------------------------------------------------------
405: 
406: SynapseScanner class method for 'instance creation'
407: 
408: new
409: 
410:     ^(super new)
411:         initialize;
412:         yourself
413: 
414: ------------------------------------------------------------
415: 
416: SynapseScanner class method for 'instance creation'
417: 
418: scan: aString
419: 
420:     ^self scanOn: aString readStream
421: 
422: ------------------------------------------------------------
423: 
424: SynapseScanner class method for 'instance creation'
425: 
426: scanOn: aStream
427: 
428:     ^(self new)
429:         scanOn: aStream;
430:         yourself
431: 
432: ================================================================================

This document was generated by KSU.TextDoclet on 2013/02/22 at 01:01:17.