SmaCC__SmaCCCharacterRENode.st
author vranyj1
Mon, 28 Dec 2009 15:53:27 +0000
changeset 15 8b8cd1701c33
parent 1 b8cca2663544
permissions -rw-r--r--
added version_SVN method
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     1
"{ Package: 'stx:goodies/smaCC' }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     3
"{ NameSpace: SmaCC }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     4
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     5
SmaCCRegularExpressionNode subclass:#SmaCCCharacterRENode
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'characters'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     7
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     8
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     9
	category:'SmaCC-Scanner Generator'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
SmaCCCharacterRENode comment:'SmaCCCharacterRENode represents a regular expression that matches one of a set of characters.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
Instance Variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	characters	<SortedCollection of: Character>	The characters that this node can accept. Note that there are no duplicates and all characters are sorted.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
!SmaCCCharacterRENode class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
characters: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	^(self new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
		characters: (self sortedCharactersFor: aString);
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
!SmaCCCharacterRENode class methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
sortedCharactersFor: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
        | characters stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
        SmaCCGrammar ignoreCase 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
                ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
                        [stream := WriteStream on: UnicodeString new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
                        aString do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
                                        [:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
                                        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
                                                nextPut: each asUppercase;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
                                                nextPut: each asLowercase]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
                ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
                        [stream := WriteStream on: (UnicodeString new: aString size).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
                        stream nextPutAll: aString].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
        characters := stream contents 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
                                asSortedCollection: [:a :b | a asInteger < b asInteger].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
        stream := WriteStream on: UnicodeString new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
        characters inject: nil
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
                into: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
                        [:sum :each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
                        sum = each ifFalse: [stream nextPut: each].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
                        each].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
        ^stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
    "Modified: / 26-05-2006 / 22:17:33 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
!SmaCCCharacterRENode methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
possibleMatchesSize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
	^self matchingCharacters size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
| aScannerNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
	(self canMergeWith: aScannerNode) ifFalse: [^super | aScannerNode].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
	characters := String 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
				withAll: ((characters , aScannerNode characters) asSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
						asSortedCollection: [:a :b | a asInteger < b asInteger]).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
	^self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
!SmaCCCharacterRENode methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
characters: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
	characters := aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
!SmaCCCharacterRENode methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
printCharacter: aCharacter on: aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
	(aCharacter asInteger between: 32 and: 126) ifTrue: [^aStream nextPut: aCharacter].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
	aStream nextPutAll: '\x'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
	aCharacter asInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
		printOn: aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
		base: 16
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
		showRadix: false
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
printOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
	| allCharacters |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
	characters size = 1 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
		ifTrue: [^self printCharacter: characters first on: aStream].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
	aStream nextPut: $[.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
	allCharacters := characters.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
	characters size > 128 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
			[aStream nextPut: $^.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
			allCharacters := ((0 to: SmaCCGrammar maximumCharacterValue) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
						collect: [:each | Character value: each]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
							reject: [:each | characters includes: each]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
	allCharacters do: [:each | self printCharacter: each on: aStream].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
	aStream nextPut: $]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
!SmaCCCharacterRENode methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
asNFAStartingWith: startNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
	| endNode |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
	endNode := SmaCCNode new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
	endNode action: action.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
	startNode addEdgeTo: endNode on: characters.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
	^endNode
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
characters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
	^characters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
matchingCharacters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
	^SmaCCGrammar ignoreCase 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
		ifTrue: [characters reject: [:each | each isLowercase]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
		ifFalse: [characters]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
possibleMatchesDo: aBlock on: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
	self matchingCharacters do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
			aStream nextPut: each.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
			aBlock value.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
			aStream skip: -1]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
!SmaCCCharacterRENode methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
canMergeWith: aScannerNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
	^self class = aScannerNode class and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
			[characters notNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
				and: [aScannerNode characters notNil and: [self action = aScannerNode action]]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
!SmaCCCharacterRENode class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCCharacterRENode.st,v 1.2 2006-05-28 20:10:18 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   144
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   145
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   146
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   147
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
! !