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.