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.