compiler/PPCMergingVisitor.st
changeset 438 20598d7ce9fa
child 452 9f4558b3be66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/PPCMergingVisitor.st	Thu Apr 30 23:43:14 2015 +0200
@@ -0,0 +1,45 @@
+"{ Package: 'stx:goodies/petitparser/compiler' }"
+
+"{ NameSpace: Smalltalk }"
+
+PPCRewritingVisitor subclass:#PPCMergingVisitor
+	instanceVariableNames:'nodeSet'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitCompiler-Visitors'
+!
+
+!PPCMergingVisitor methodsFor:'as yet unclassified'!
+
+equivalentNode: node
+	^  nodeSet detect: [ :e | e = node ]
+!
+
+hasEquivalentNode: node
+	^ nodeSet includes: node
+!
+
+initialize
+	super initialize.
+	
+	nodeSet := Set new
+!
+
+store: node
+	self assert: (self hasEquivalentNode: node) not.
+	nodeSet add: node
+!
+
+visitNode: node
+	super visitNode: node.
+	
+	(self hasEquivalentNode: node) ifTrue: [
+		self change.
+		^ self equivalentNode: node
+	] ifFalse: [  
+		self store: node
+	].
+
+	^ node
+! !
+