compiler/PPCRecognizerComponentDetector.st
changeset 452 9f4558b3be66
child 515 b5316ef15274
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/PPCRecognizerComponentDetector.st	Sun May 10 06:28:36 2015 +0100
@@ -0,0 +1,64 @@
+"{ Package: 'stx:goodies/petitparser/compiler' }"
+
+"{ NameSpace: Smalltalk }"
+
+PPCRewritingVisitor subclass:#PPCRecognizerComponentDetector
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitCompiler-Visitors'
+!
+
+!PPCRecognizerComponentDetector methodsFor:'visiting'!
+
+visitNotNode: node
+    "We don't need result of the not,..."
+    | child newChild |
+    self change.
+    child := node child.
+    newChild := self visitWithRecognizingComponentVisitor: child.
+    node replace: child with: newChild.
+    ^ node
+!
+
+visitTokenNode: node
+    | child newChild |
+    
+    self change.
+    child := node child.
+    newChild := self visitWithRecognizingComponentVisitor: child.
+    node replace: child with: newChild.
+    
+    ^ node
+!
+
+visitTrimmingTokenNode: node
+    | child newChild whitespace newWhitespace |
+    
+    self change.
+    child := node child.
+    newChild := self visitWithRecognizingComponentVisitor: child.
+    node replace: child with: newChild.
+
+    whitespace := node whitespace.
+    newWhitespace := self visitWithRecognizingComponentVisitor: whitespace.
+    node replace: whitespace with: newWhitespace.
+
+    
+    ^ node
+!
+
+visitWithRecognizingComponentVisitor: node
+    | retval forbiddenNodes copyVisitor tokenVisitor |
+    
+    copyVisitor := PPCCopyVisitor new.
+    tokenVisitor := PPCRecognizerComponentVisitor new.
+    
+    forbiddenNodes := openSet copy.
+    tokenVisitor forbiddenNodes: forbiddenNodes.
+
+    retval := copyVisitor visit: node.
+    retval := tokenVisitor visit: retval.
+    ^ retval
+! !
+