SmaCC__SmaCCCharacterRENode.st
author vranyj1
Mon, 10 Sep 2012 09:07:46 +0000
changeset 23 11ad79f459e6
parent 15 8b8cd1701c33
permissions -rw-r--r--
- stx_goodies_smaCC added: #svnRepositoryUrlString changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - SmaCC::SmaCCRHS changed: #parseTreeRewriter

"{ Package: 'stx:goodies/smaCC' }"

"{ NameSpace: SmaCC }"

SmaCCRegularExpressionNode subclass:#SmaCCCharacterRENode
	instanceVariableNames:'characters'
	classVariableNames:''
	poolDictionaries:''
	category:'SmaCC-Scanner Generator'
!

SmaCCCharacterRENode comment:'SmaCCCharacterRENode represents a regular expression that matches one of a set of characters.

Instance Variables:
	characters	<SortedCollection of: Character>	The characters that this node can accept. Note that there are no duplicates and all characters are sorted.

'
!


!SmaCCCharacterRENode class methodsFor:'instance creation'!

characters: aString 
	^(self new)
		characters: (self sortedCharactersFor: aString);
		yourself
! !

!SmaCCCharacterRENode class methodsFor:'private'!

sortedCharactersFor: aString 
        | characters stream |
        SmaCCGrammar ignoreCase 
                ifTrue: 
                        [stream := WriteStream on: UnicodeString new.
                        aString do: 
                                        [:each | 
                                        stream
                                                nextPut: each asUppercase;
                                                nextPut: each asLowercase]]
                ifFalse: 
                        [stream := WriteStream on: (UnicodeString new: aString size).
                        stream nextPutAll: aString].
        characters := stream contents 
                                asSortedCollection: [:a :b | a asInteger < b asInteger].
        stream := WriteStream on: UnicodeString new.
        characters inject: nil
                into: 
                        [:sum :each | 
                        sum = each ifFalse: [stream nextPut: each].
                        each].
        ^stream contents

    "Modified: / 26-05-2006 / 22:17:33 / janfrog"
! !

!SmaCCCharacterRENode methodsFor:'accessing'!

possibleMatchesSize
	^self matchingCharacters size
!

| aScannerNode 
	(self canMergeWith: aScannerNode) ifFalse: [^super | aScannerNode].
	characters := String 
				withAll: ((characters , aScannerNode characters) asSet 
						asSortedCollection: [:a :b | a asInteger < b asInteger]).
	^self
! !

!SmaCCCharacterRENode methodsFor:'initialize-release'!

characters: aString 
	characters := aString
! !

!SmaCCCharacterRENode methodsFor:'printing'!

printCharacter: aCharacter on: aStream
	(aCharacter asInteger between: 32 and: 126) ifTrue: [^aStream nextPut: aCharacter].
	aStream nextPutAll: '\x'.
	aCharacter asInteger 
		printOn: aStream
		base: 16
		showRadix: false
!

printOn: aStream 
	| allCharacters |
	characters size = 1 
		ifTrue: [^self printCharacter: characters first on: aStream].
	aStream nextPut: $[.
	allCharacters := characters.
	characters size > 128 
		ifTrue: 
			[aStream nextPut: $^.
			allCharacters := ((0 to: SmaCCGrammar maximumCharacterValue) 
						collect: [:each | Character value: each]) 
							reject: [:each | characters includes: each]].
	allCharacters do: [:each | self printCharacter: each on: aStream].
	aStream nextPut: $]
! !

!SmaCCCharacterRENode methodsFor:'private'!

asNFAStartingWith: startNode 
	| endNode |
	endNode := SmaCCNode new.
	endNode action: action.
	startNode addEdgeTo: endNode on: characters.
	^endNode
!

characters
	^characters
!

matchingCharacters
	^SmaCCGrammar ignoreCase 
		ifTrue: [characters reject: [:each | each isLowercase]]
		ifFalse: [characters]
!

possibleMatchesDo: aBlock on: aStream 
	self matchingCharacters do: 
			[:each | 
			aStream nextPut: each.
			aBlock value.
			aStream skip: -1]
! !

!SmaCCCharacterRENode methodsFor:'public'!

canMergeWith: aScannerNode 
	^self class = aScannerNode class and: 
			[characters notNil 
				and: [aScannerNode characters notNil and: [self action = aScannerNode action]]]
! !

!SmaCCCharacterRENode class methodsFor:'documentation'!

version
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCCharacterRENode.st,v 1.2 2006-05-28 20:10:18 vranyj1 Exp $'
!

version_SVN
    ^ '$Id$'
! !