MCScanner.st
author Claus Gittinger <cg@exept.de>
Sat, 20 Aug 2011 14:27:31 +0200
changeset 336 29a2bf7d3b0b
parent 225 4453a8f6fb4a
child 678 ec1bd261c5d6
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/monticello' }"
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#MCScanner
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'stream'
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Monticello-Chunk Format'
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
!MCScanner class methodsFor:'as yet unclassified'!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
scan: aStream
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    14
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    15
    | v |
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    16
    "Kludge"
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    17
    ^ (self new stream: aStream) next
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    18
    "
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    19
    [ v := (self new stream: aStream) next ]
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    20
        on: RecursionInterruptSignal do:[:ex|ex proceed].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    21
    ^v
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    22
    "
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    23
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    24
    "Modified: / 13-10-2010 / 15:52:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
scanTokens: aString
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
	"compatibility"
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
	^ Array with: (self scan: aString readStream)
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
! !
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!MCScanner methodsFor:'as yet unclassified'!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
next
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    35
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    36
    | token stack array |
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    37
    token := self nextToken.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    38
    token == $) ifTrue:[self error: 'Array not opened'].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    39
    token ~= $( ifTrue:[^token].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    40
    stack := Stack with: (array := OrderedCollection new).
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    41
    [ stack isEmpty ] whileFalse:[
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    42
        token := self nextToken.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    43
        token == $( 
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    44
            ifTrue:
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    45
                [stack push: OrderedCollection new]
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    46
            ifFalse:
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    47
                [token == $) 
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    48
                    ifTrue:
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    49
                        [|top|
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    50
                        top := stack top asArray.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    51
                        stack pop.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    52
                        stack size > 0 ifTrue:[stack top add: top]]
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    53
                    ifFalse:
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    54
                        [stack top add: token]]].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    55
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    56
    ^array asArray
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    57
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    58
    "Modified: / 28-10-2010 / 13:31:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
nextArray
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
	stream next. "("
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	^ Array streamContents:
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
		[:s |
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
		[stream skipSeparators.
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
		(stream peek = $)) or: [stream atEnd]] whileFalse: [s nextPut: self next].
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
		stream next = $) ifFalse: [self error: 'Unclosed array']]
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
nextString
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	^ stream nextDelimited: $'
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
nextSymbol
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
	^ (String streamContents:
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
		[:s |
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
		[stream peek isAlphaNumeric] whileTrue: [s nextPut: stream next]]) asSymbol
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
			
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    81
nextToken
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    82
        | c |
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    83
        stream skipSeparators.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    84
        c := stream peek.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    85
        c = $# ifTrue: [c := stream next; peek].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    86
        c = $' ifTrue: [^ self nextString].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    87
        c = $( ifTrue: [stream next.^ $(].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    88
        c = $) ifTrue: [stream next.^ $)].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    89
        c isAlphaNumeric ifTrue: [^ self nextSymbol].
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    90
        self error: 'Unknown token type'.
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    91
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    92
    "Created: / 28-10-2010 / 13:20:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    93
!
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    94
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
stream: aStream
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
    96
	stream := aStream
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
! !
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
!MCScanner class methodsFor:'documentation'!
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
version
336
29a2bf7d3b0b initial checkin
Claus Gittinger <cg@exept.de>
parents: 225
diff changeset
   102
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCScanner.st,v 1.3 2011-08-20 12:27:31 cg Exp $'
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   103
!
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   104
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   105
version_CVS
336
29a2bf7d3b0b initial checkin
Claus Gittinger <cg@exept.de>
parents: 225
diff changeset
   106
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCScanner.st,v 1.3 2011-08-20 12:27:31 cg Exp $'
225
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   107
!
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   108
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   109
version_SVN
4453a8f6fb4a added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 40
diff changeset
   110
    ^ '§Id: MCScanner.st 23 2010-10-29 14:41:24Z vranyj1 §'
40
34febde6d331 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
! !