--- /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
+! !
+