SmaCC__SmaCCEdge.st
author vranyj1
Wed, 17 Nov 2010 21:57:55 +0000
changeset 20 4ea23addc2c4
parent 16 55254a6f8404
child 26 b2c091b8cea1
permissions -rw-r--r--
Makefile updated
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
Object subclass:#SmaCCEdge
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'toNode characters'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     7
	classVariableNames:'IsExpressions'
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
SmaCCEdge comment:'SmaCCEdge represents a transition in a Finite Automata (directed graph). It is labeled with the characters (possibly none, indicating an epsilon transition) that cause the transition.
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 cause the transition. Note that there are no duplicates and all characters are sorted.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
	toNode	<SmaCCNode>	The node that this is transitioning to.'
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
!SmaCCEdge class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
to: aNode on: aStringOrNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
	| edge |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	edge := self new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
	edge to: aNode on: aStringOrNil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
	^edge
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
!SmaCCEdge class methodsFor:'class initialization'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
generateCharacterSetFor: aSelector 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
        stream := WriteStream on: UnicodeString new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
        0 to: SmaCCGrammar maximumCharacterValue
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
                do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
                        [:i | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
                        | ch |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
                        ch := Character value: i.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
                        (ch perform: aSelector) ifTrue: [stream nextPut: ch]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
        ^stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
    "Modified: / 26-05-2006 / 22:16:27 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
initializeIsExpressions
16
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    46
    "Creates a map from sets of characters to selectors that start with 'is' on Character. This allows generated scanners to take
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    47
     full advantage of selectors that are already implemented on Character"
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    48
    
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    49
    |selectors|
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    50
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    51
    IsExpressions := Dictionary new.
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    52
    selectors := OrderedCollection new.
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
16
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    54
    "This code ensures that any extension isXXX methods will not
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    55
     be taken"
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    56
    Character methodDictionary do:
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    57
                [:method| | selector |
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    58
                selector := method selector.
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    59
                ((selector startsWith:'is') and:[method numArgs = 0 and:[method package == Character package]])
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    60
                    ifTrue:[selectors add:selector]].
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    61
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    62
    selectors do:[:sel | 
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    63
        |string|
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    64
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    65
        string := self generateCharacterSetFor:sel.
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    66
        string isEmpty ifFalse:[
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    67
            IsExpressions at:string put:sel
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    68
        ]
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    69
    ]
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    70
55254a6f8404 Generated scanners how uses Character>>is* methods on iff they
vranyj1
parents: 15
diff changeset
    71
    "Modified: / 15-02-2010 / 16:57:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
!SmaCCEdge methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
mergeWith: anEdge 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
	characters := String withAll: ((characters , anEdge characters) asSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
						asSortedCollection: [:a :b | a asInteger < b asInteger])
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
to
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
	^toNode
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
!SmaCCEdge methodsFor:'comparing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
< anEdge
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
        "required for ST/X, where SortedCollection uses < to compare"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
        ^self to id < anEdge to id
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
<= anEdge 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
	^self to id <= anEdge to id
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
= anEdge 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
	self class = anEdge class ifFalse: [^false].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
	^self to = anEdge to and: [self characters = anEdge characters]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
	^(self to hash bitShift: 14) bitXor: characters hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
!SmaCCEdge methodsFor:'compiling'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
closestIsExpression
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
	"Attempts to find the #is selector that most closely matches the character set that this edge transitions on."
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
	| expressions closest |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
	expressions := IsExpressions keys 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
				select: [:each | (each reject: [:ch | self includesCharacter: ch]) isEmpty].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
	expressions isEmpty ifTrue: [^nil].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
	closest := IsExpressions 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
				at: (expressions asSortedCollection: [:a :b | a size > b size]) first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
	(self minMaxPairsWithout: closest) size 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
		<= (self minMaxPairsWithout: nil) size ifFalse: [^nil].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
	^closest
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
expression
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
	| stream isSelector |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
	stream := WriteStream on: (String new: 128).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
	stream nextPut: $(.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
	characters size = SmaCCGrammar maximumCharacterValue 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
		ifTrue: [self outputInvertedMatchOn: stream]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
		ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
			[isSelector := self outputClosestIsMethodOn: stream.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
			self outputExpressionOn: stream without: isSelector].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
	stream nextPut: $).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
	^stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
minMaxPairsWithout: aSelector 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
	"Converts a list of characters into a collection of pairs representing the minimum and maximum of each sequence.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
	The list is first filtered to include only those characters that fail aSelector."
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
	| start last pairs charsLeft |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
	charsLeft := aSelector isNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
				ifTrue: [characters]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
				ifFalse: [characters reject: [:ch | ch perform: aSelector]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
	pairs := OrderedCollection new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
	charsLeft isEmpty ifTrue: [^pairs].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
	last := charsLeft first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
	start := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
	charsLeft do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
			last asInteger + 1 = each asInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
				ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
					[start notNil ifTrue: [pairs add: (Array with: start with: last)].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
					start := each].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
			last := each].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
	pairs add: (Array with: start with: last).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
	^pairs
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
outputClosestIsMethodOn: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
	| expr |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
	expr := self closestIsExpression.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
	expr isNil ifFalse: [stream nextPutAll: 'currentCharacter ' , expr].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
	^expr
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
outputExpressionFor: aPair on: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
	aPair first == aPair last 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
		ifTrue: [^self outputMatchSingleCharacter: aPair first on: stream].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
	aPair first = (Character value: 0) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
		ifTrue: [^self outputMatchLessThan: aPair last on: stream].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
	aPair last = (Character value: SmaCCGrammar maximumCharacterValue) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
		ifTrue: [^self outputMatchGreaterThan: aPair first on: stream].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
	self outputMatchRange: aPair on: stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
outputExpressionOn: aStream without: aSelector 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
	| pairs |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
	pairs := self minMaxPairsWithout: aSelector.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
	pairs isEmpty ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
	aSelector notNil ifTrue: [aStream nextPutAll: ' or: ['].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
	pairs do: [:each | self outputExpressionFor: each on: aStream]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
		separatedBy: [aStream nextPutAll: ' or: ['].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
	aStream next: pairs size - 1 put: $].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
	aSelector notNil ifTrue: [aStream nextPut: $]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
outputInvertedMatchOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
	| char |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
	char := Character value: ((0 to: SmaCCGrammar maximumCharacterValue) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
						detect: [:each | (characters includes: (Character value: each)) not]).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
	aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
		nextPutAll: 'currentCharacter ~~ ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
		nextPutAll: char storeString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
outputMatchGreaterThan: aCharacter on: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
	stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
		nextPutAll: 'currentCharacter >= ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
		nextPutAll: aCharacter storeString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
outputMatchLessThan: aCharacter on: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
	stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
		nextPutAll: 'currentCharacter <= ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
		nextPutAll: aCharacter storeString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
outputMatchRange: aPair on: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
	stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
		nextPutAll: '(currentCharacter between: ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
		nextPutAll: aPair first storeString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
		nextPutAll: ' and: ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
		nextPutAll: aPair last storeString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
		nextPutAll: ')'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
outputMatchSingleCharacter: aCharacter on: stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
	stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
		nextPutAll: 'currentCharacter == ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
		nextPutAll: aCharacter storeString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
!SmaCCEdge methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
to: aNode on: aStringOrNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
	toNode := aNode.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
	characters := aStringOrNil
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
!SmaCCEdge methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
printOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
	aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
		nextPutAll: '---';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
		nextPutAll: (characters ifNil: ['""']);
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
		nextPutAll: '--->';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
		nextPutAll: toNode printString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
!SmaCCEdge methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
characters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
	^characters
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
removeCharacters: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
	characters := characters 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
				reject: [:each | self does: aCollection includeCharacter: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
!SmaCCEdge methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   251
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   252
conflictsWith: anEdge 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   253
	^characters anySatisfy: [:each | anEdge characters includes: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   254
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   256
does: aString includeCharacter: aCharacter 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   257
	| start stop mid |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   258
	start := 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   259
	stop := aString size.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   260
	stop = 0 ifTrue: [^false].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   261
	
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   262
	[mid := (start + stop) // 2.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   263
	mid == start] whileFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   264
				[(aString at: mid) asInteger < aCharacter asInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   265
					ifTrue: [start := mid]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   266
					ifFalse: [stop := mid]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   267
	^(aString at: start) == aCharacter or: [(aString at: stop) == aCharacter]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   268
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   269
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   270
includesCharacter: aCharacter 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   271
	^self does: characters includeCharacter: aCharacter
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   272
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   273
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   274
isEmpty
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   275
	^characters isEmpty
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   276
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   277
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   278
isEpsilonTransition
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   279
	^characters isNil
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   280
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   281
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   282
!SmaCCEdge class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   283
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   284
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   285
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCEdge.st,v 1.2 2006-05-28 20:08:49 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   286
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   287
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   288
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   289
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   290
! !