[squeak-dev] Reusable browsers was Re: About HyperCard

Juan Vuletich (mail lists) juanlists at jvuletich.org
Sun Mar 3 00:30:06 UTC 2013


Great! Thanks Bob! This will be in the Cuis update stream soon.

Quoting Bob Arning <arning315 at comcast.net>:

>
> On 3/2/13 7:48 AM, Bert Freudenberg wrote:
>> The proper way to deal with the remaining cases (short of actual  
>> parsing) would be to strip all Strings/Symbols/Comments before the  
>> tokenization, I think. Takers?:)
> Maybe this will do:
>
> 'From Squeak4.4 of 1 March 2013 [latest update: #12489] on 2 March  
> 2013 at 12:08:27 pm'!
> "Change Set:        FindSelector2
> Date:            2 March 2013
> Author:            Bob Arning
>
> String>>findSelector2 uses Scanner to better ignore extraneous stuff"!
>
>
> !Scanner methodsFor: 'expression types' stamp: 'raa 3/2/2013 11:55'!
> scanForFindSelectorUpTo: terminator
> "
> Scanner findSelectorTests
> "
>     | s |
>
>     s := WriteStream on: (String new: 100).
>     [tokenType == terminator or: [tokenType == #doIt]] whileFalse: [
>         tokenType caseOf: {
>             [#leftParenthesis] -> [self scanToken;  
> scanForFindSelectorUpTo: #rightParenthesis].
>             [#leftBracket] -> [self scanToken;  
> scanForFindSelectorUpTo: #rightBracket].
>             [#leftBrace] -> [self scanToken;  
> scanForFindSelectorUpTo: #rightBrace].
>             [#keyword] -> [s nextPutAll: token].
>         } otherwise: [].
>         self scanToken
>     ].
>     ^s contents! !
>
>
> !Scanner class methodsFor: 'testing' stamp: 'raa 3/2/2013 12:05'!
> findSelectorIn: aString
>
>     | result |
>     result _ Scanner new
>         scan: (ReadStream on:  aString);
>         scanForFindSelectorUpTo: #notATerminator.
>     ^result! !
>
> !Scanner class methodsFor: 'testing' stamp: 'raa 3/2/2013 12:02'!
> findSelectorTests
> "
> Scanner findSelectorTests explore
> "
>     ^#(
>         '3 perform: #between:and: with: 1 with: 5'
>         'self do: [:i | ] separatedBy: [] '
>         'self perform: #add: with: anObject'
>         'self do: [:i | i do: [ :each | ] ] separatedBy: [] '
>         'self x: {self y:} y: ''self new: 100'''
>         'a max:b'
>         'a'
>     ) collect: [ :e |
>         {e. self findSelectorIn: e}
>     ].! !
>
>
> !String methodsFor: 'converting' stamp: 'raa 3/2/2013 12:02'!
> findSelector2
>     "Revised to use scanner for better removal of extraneous stuff"
>
>     | sel |
>
>     sel := self withBlanksTrimmed.
>     (sel includes: $:) ifTrue: [sel _ Scanner findSelectorIn: sel].
>     sel isEmpty ifTrue: [^ nil].
>     sel isOctetString ifTrue: [sel := sel asOctetString].
>     Symbol hasInterned: sel ifTrue:
>         [:aSymbol | ^ aSymbol].
>     ^ nil! !
>
>
>
>


Cheers,
Juan Vuletich



More information about the Squeak-dev mailing list