SmaCC__SmaCCItemSet.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 07 Dec 2016 13:18:16 +0000
changeset 26 b2c091b8cea1
parent 15 8b8cd1701c33
permissions -rw-r--r--
Fixed initialization of SmaCCEdge There's no `UnicodeString` anymore. Changed: WriteStream on: UnicodeString new to: String new writeStream
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
Set subclass:#SmaCCItemSet
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'type derivedFrom id'
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-Parser 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
SmaCCItemSet comment:'SmaCCItemSet represents a LALR(1) or a LR(1) item set.
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
	type	<Symbol>	#LALR1 or #LR1
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
!SmaCCItemSet class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
new: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	^(super new: anInteger)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
		initialize;
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
!SmaCCItemSet methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
action: aGrammarSymbol prefer: aClass 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
	| action actionItem eachAction |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
	action := SmaCCRejectAction new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
	self do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
			eachAction := each action: aGrammarSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
			action class = SmaCCRejectAction 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
				ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
					[action := eachAction.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
					actionItem := each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
				ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
					[(eachAction = action or: [eachAction class = SmaCCRejectAction]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
						ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
							[eachAction class = SmaCCShiftAction | (action class = SmaCCShiftAction) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
								ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
									["Shift/Reduce conflict -- check precedence"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
									(aGrammarSymbol precedence isNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
										or: [each precedence isNil or: [actionItem precedence isNil]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
											ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
												["No precedence, choose shift"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
												eachAction class = SmaCCShiftAction 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
													ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
														[self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
															raiseXReduceNotification: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
															with: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
															type: 'Shift/Reduce Conflict'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
														action := eachAction.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
														actionItem := each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
													ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
														[self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
															raiseXReduceNotification: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
															with: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
															type: 'Shift/Reduce Conflict']]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
											ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
												[(each precedence > actionItem precedence 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
													or: [each precedence = actionItem precedence and: [eachAction class = aClass]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
														ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
															[self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
																raiseXReduceNotification: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
																with: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
																type: 'Shift/Reduce Conflict (handled by precedence rules)'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
															action := eachAction.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
															actionItem := each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
														ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
															[(each precedence = actionItem precedence and: [SmaCCRejectAction = aClass]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
																ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
																	[self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
																		raiseXReduceNotificationWithNoPreferredItem: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
																		with: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
																		type: 'Shift/Reduce Conflict (handled by precedence rules)'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
																	^aClass new]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
																ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
																	[self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
																		raiseXReduceNotification: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
																		with: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
																		type: 'Shift/Reduce Conflict (handled by precedence rules)']]]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
								ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
									["Reduce/Reduce conflict -- just pick one and proceed"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
									self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
										raiseXReduceNotification: actionItem
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
										with: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
										type: 'Reduce/Reduce Conflict']]]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
	^action
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
derivedFrom
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
    ^ derivedFrom
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
    "Created: / 14-02-2008 / 13:26:17 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
derivedFrom:something
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
    derivedFrom := something.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
    "Created: / 14-02-2008 / 13:26:17 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
id
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
    ^ id
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
    "Created: / 14-02-2008 / 13:28:54 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
id:something
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
    id := something.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
    "Created: / 14-02-2008 / 13:28:54 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
mergeWith: anItemSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
	self == anItemSet ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
	anItemSet do: [:each | self add: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
moveOn: aGrammarSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
        | anItemSet |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
        anItemSet := self class new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
        anItemSet type: type.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
        anItemSet derivedFrom: self.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
        self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
                do: [:each | each nextSymbol == aGrammarSymbol ifTrue: [anItemSet add: each moveNext]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
        ^anItemSet
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
    "Modified: / 14-02-2008 / 13:26:51 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
raiseXReduceNotification: preferredItem with: otherItem type: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
        stream := WriteStream on: (String new: 200).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
                nextPutAll: preferredItem printString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
                nextPutAll: '   *****';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
                nextPutAll: otherItem printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
            SmaCCCompilationNotification raiseSignal: aString with: stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
            SmaCCCompilationNotification signal: aString with: stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
        ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
raiseXReduceNotificationWithNoPreferredItem: firstItem with: secondItem type: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
        stream := WriteStream on: (String new: 200).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
                nextPutAll: firstItem printString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
                nextPutAll: secondItem printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
            SmaCCCompilationNotification raiseSignal: aString with: stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
            SmaCCCompilationNotification signal: aString with: stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
        ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
        
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
!SmaCCItemSet methodsFor:'adding'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
add: aLR1Item
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
        | index item |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
        aLR1Item == nil ifTrue: [^aLR1Item].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
            index := self findKeyOrNil: aLR1Item.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
            item := keyArray basicAt: index.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
            item == nil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
                    ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
                            [keyArray basicAt: index put: aLR1Item.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
                             tally := tally + 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
                            self performClosureOn: aLR1Item]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
                    ifFalse: [item mergeWith: aLR1Item].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
            index := self findElementOrNil: aLR1Item.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
            item := self basicAt: index.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
            item == nil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
                    ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
                            [self privateAt: index put: aLR1Item.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
                            self performClosureOn: aLR1Item]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
                    ifFalse: [item mergeWith: aLR1Item].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
        ^aLR1Item
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
!SmaCCItemSet methodsFor:'comparing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
= anItemSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
	self class = anItemSet class 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
			[type == #LALR1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
				ifTrue: [^self isLALREqualTo: anItemSet]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
				ifFalse: [^self isLREqualTo: anItemSet]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
	^false
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
	^self inject: self class hash into: [:sum :each | sum bitXor: each hash]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
!SmaCCItemSet methodsFor:'copying'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
copyEmpty: aSize 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
	^(super copyEmpty: aSize)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
		type: type;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
!SmaCCItemSet methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
	(self class superclass canUnderstand: #initialize) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
		ifTrue: [super initialize].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
	type := #LALR1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
type: aSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
	type := aSymbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
!SmaCCItemSet methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
printOn:aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
    id ifNotNil:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
        [aStream nextPutAll: id printString asText allBold].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
    derivedFrom ifNotNil:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
        [derivedFrom id ifNotNil:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
            [aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
                nextPutAll:' (derived from ';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
                nextPutAll:derivedFrom id printString asText allBold;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
                nextPut:$)]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
    aStream cr.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
    self do:[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
        aStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
            tab;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
            nextPutAll:each printString;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
            cr
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
    ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   251
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   252
    "Modified: / 14-02-2008 / 13:34:50 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   253
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   254
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
!SmaCCItemSet methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   256
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   257
itemFor: anObject 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   258
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   259
            ^keyArray basicAt: (self findKeyOrNil: anObject)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   260
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   261
        ^self basicAt: (self findElementOrNil: anObject)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   262
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   263
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   264
performClosureOn: aLR1Item 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   265
	| nextSymbol rest first followers |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   266
	nextSymbol := aLR1Item nextSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   267
	nextSymbol isTerminal ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   268
	rest := aLR1Item rest.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   269
	first := rest firstTerminals.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   270
	followers := SmaCCSymbolSet new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   271
	(first includes: SmaCCSymbol empty) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   272
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   273
			[first remove: SmaCCSymbol empty.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   274
			followers baseOn: aLR1Item followers].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   275
	followers addAll: first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   276
	nextSymbol productionsDo: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   277
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   278
			self add: (SmaCCLR1Item 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   279
						symbol: nextSymbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   280
						rhs: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   281
						follow: followers)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   282
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   283
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   284
!SmaCCItemSet methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   285
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   286
isLALREqualTo: anItemSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   287
	^anItemSet size = self size 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   288
		and: [self allSatisfy: [:each | anItemSet includes: each]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   289
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   290
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   291
isLREqualTo: anItemSet 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   292
	^anItemSet size = self size and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   293
			[self allSatisfy: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   294
					[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   295
					| item |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   296
					(item := anItemSet itemFor: each) notNil and: [each isLR1EqualTo: item]]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   297
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   298
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   299
!SmaCCItemSet class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   300
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   301
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   302
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCItemSet.st,v 1.2 2008-02-17 10:30:37 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   303
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   304
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   305
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   306
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   307
! !