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.