PPCConfiguration refactoring: [7/10]: allow to configure passes
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 04 Sep 2015 14:06:56 +0100
changeset 535 a8feb0f47574
parent 534 a949c4fe44df
child 536 548996aca274
PPCConfiguration refactoring: [7/10]: allow to configure passes ...run during compilation by setting a collection of passes to run. Got rid of PPCPluggableConfiguration and PPCConfiguration subclasses. Removed a bunch of options used to suppress certain passes.
compiler/Make.proto
compiler/Make.spec
compiler/PPCCompilationOptions.st
compiler/PPCConfiguration.st
compiler/PPCPluggableConfiguration.st
compiler/PPCTokenizingConfiguration.st
compiler/PPCUniversalConfiguration.st
compiler/abbrev.stc
compiler/bc.mak
compiler/benchmarks/PPCSmalltalkNoopParser.st
compiler/libInit.cc
compiler/stx_goodies_petitparser_compiler.st
compiler/tests/PPCCodeGeneratorTest.st
compiler/tests/PPCLTokenizingOptimizationTest.st
compiler/tests/PPCNodeFirstFollowNextTests.st
compiler/tests/PPCOptimizeChoicesTest.st
compiler/tests/PPCOverlappingTokensTest.st
compiler/tests/PPCTokenizingCodeGeneratorTest.st
compiler/tests/PPCTokenizingTest.st
compiler/tests/PPCUnivarsalGuardTest.st
compiler/tests/PPCUniversalOptimizationTest.st
compiler/tests/PPCUniversalTest.st
compiler/tests/extras/PPCLRPCompiledParserSmokeTest.st
--- a/compiler/Make.proto	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/Make.proto	Fri Sep 04 14:06:56 2015 +0100
@@ -155,7 +155,6 @@
 $(OUTDIR)PPCNode.$(O) PPCNode.$(H): PPCNode.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCNodeVisitor.$(O) PPCNodeVisitor.$(H): PPCNodeVisitor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCPass.$(O) PPCPass.$(H): PPCPass.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)PPCPluggableConfiguration.$(O) PPCPluggableConfiguration.$(H): PPCPluggableConfiguration.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScanner.$(O) PPCScanner.$(H): PPCScanner.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerError.$(O) PPCScannerError.$(H): PPCScannerError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerResultStrategy.$(O) PPCScannerResultStrategy.$(H): PPCScannerResultStrategy.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -190,9 +189,7 @@
 $(OUTDIR)PPCProfilingContext.$(O) PPCProfilingContext.$(H): PPCProfilingContext.st $(INCLUDE_TOP)/stx/goodies/petitparser/PPStream.$(H) $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCContext.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/PeekableStream.$(H) $(INCLUDE_TOP)/stx/libbasic/PositionableStream.$(H) $(INCLUDE_TOP)/stx/libbasic/ReadStream.$(H) $(INCLUDE_TOP)/stx/libbasic/Stream.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerCodeGenerator.$(O) PPCScannerCodeGenerator.$(H): PPCScannerCodeGenerator.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCPass.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCTokenizingCodeGen.$(O) PPCTokenizingCodeGen.$(H): PPCTokenizingCodeGen.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCCodeGen.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)PPCTokenizingConfiguration.$(O) PPCTokenizingConfiguration.$(H): PPCTokenizingConfiguration.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCConfiguration.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUniversalCodeGen.$(O) PPCUniversalCodeGen.$(H): PPCUniversalCodeGen.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCCodeGen.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)PPCUniversalConfiguration.$(O) PPCUniversalConfiguration.$(H): PPCUniversalConfiguration.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCConfiguration.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUniversalResultStrategy.$(O) PPCUniversalResultStrategy.$(H): PPCUniversalResultStrategy.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCScannerResultStrategy.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUnknownNode.$(O) PPCUnknownNode.$(H): PPCUnknownNode.st $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCNode.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)PPTokenizingCompiledParser.$(O) PPTokenizingCompiledParser.$(H): PPTokenizingCompiledParser.st $(INCLUDE_TOP)/stx/goodies/petitparser/PPParser.$(H) $(INCLUDE_TOP)/stx/goodies/petitparser/compiler/PPCompiledParser.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
--- a/compiler/Make.spec	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/Make.spec	Fri Sep 04 14:06:56 2015 +0100
@@ -81,7 +81,6 @@
 	PPCNode \
 	PPCNodeVisitor \
 	PPCPass \
-	PPCPluggableConfiguration \
 	PPCScanner \
 	PPCScannerError \
 	PPCScannerResultStrategy \
@@ -116,9 +115,7 @@
 	PPCProfilingContext \
 	PPCScannerCodeGenerator \
 	PPCTokenizingCodeGen \
-	PPCTokenizingConfiguration \
 	PPCUniversalCodeGen \
-	PPCUniversalConfiguration \
 	PPCUniversalResultStrategy \
 	PPCUnknownNode \
 	PPTokenizingCompiledParser \
@@ -216,7 +213,6 @@
     $(OUTDIR_SLASH)PPCNode.$(O) \
     $(OUTDIR_SLASH)PPCNodeVisitor.$(O) \
     $(OUTDIR_SLASH)PPCPass.$(O) \
-    $(OUTDIR_SLASH)PPCPluggableConfiguration.$(O) \
     $(OUTDIR_SLASH)PPCScanner.$(O) \
     $(OUTDIR_SLASH)PPCScannerError.$(O) \
     $(OUTDIR_SLASH)PPCScannerResultStrategy.$(O) \
@@ -251,9 +247,7 @@
     $(OUTDIR_SLASH)PPCProfilingContext.$(O) \
     $(OUTDIR_SLASH)PPCScannerCodeGenerator.$(O) \
     $(OUTDIR_SLASH)PPCTokenizingCodeGen.$(O) \
-    $(OUTDIR_SLASH)PPCTokenizingConfiguration.$(O) \
     $(OUTDIR_SLASH)PPCUniversalCodeGen.$(O) \
-    $(OUTDIR_SLASH)PPCUniversalConfiguration.$(O) \
     $(OUTDIR_SLASH)PPCUniversalResultStrategy.$(O) \
     $(OUTDIR_SLASH)PPCUnknownNode.$(O) \
     $(OUTDIR_SLASH)PPTokenizingCompiledParser.$(O) \
--- a/compiler/PPCCompilationOptions.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/PPCCompilationOptions.st	Fri Sep 04 14:06:56 2015 +0100
@@ -93,7 +93,9 @@
 !
 
 tokenize
-    ^ self at: #tokenize ifAbsent: true
+    ^ self at: #tokenize ifAbsent: false
+
+    "Modified: / 04-09-2015 / 15:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tokenize: aBoolean
@@ -114,14 +116,6 @@
 
 !PPCCompilationOptions methodsFor:'options - undocumented (do not use)'!
 
-cacheFirstFollow
-    ^ self at: #cacheFirstFollow ifAbsent: true
-!
-
-cacheFirstFollow: value
-    self set: #cacheFirstFollow to: value.
-!
-
 debug
     ^ self at: #debug ifAbsent: true
 !
@@ -146,18 +140,10 @@
     self set: #guards to: value.
 !
 
-inline
-    ^ self at: #inline ifAbsent: true
-!
-
-inline: value
-    self set: #inline to: value.
-!
-
 parserSuperclass
     ^ self at: #parserSuperclass ifAbsent: nil
 
-    "Modified: / 01-09-2015 / 08:45:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:06:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 parserSuperclass: value
@@ -178,14 +164,6 @@
 
 scannerSuperclass: value
     self set: #scannerSuperclass to: value.
-!
-
-specialize
-    ^ self at: #specialize ifAbsent: true
-!
-
-specialize: value
-    self set: #specialize to: value.
 ! !
 
 !PPCCompilationOptions methodsFor:'private'!
--- a/compiler/PPCConfiguration.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/PPCConfiguration.st	Fri Sep 04 14:06:56 2015 +0100
@@ -3,7 +3,7 @@
 "{ NameSpace: Smalltalk }"
 
 Object subclass:#PPCConfiguration
-	instanceVariableNames:'context ir history'
+	instanceVariableNames:'context ir history passes'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'PetitCompiler-Core'
@@ -22,11 +22,27 @@
 !
 
 tokenizing
-    ^ PPCTokenizingConfiguration new
+    | options |
+
+    options := PPCCompilationOptions default.
+    options tokenize: true.
+    ^ PPCConfiguration new
+        options: options;
+        yourself
+
+    "Modified: / 04-09-2015 / 16:21:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 universal
-    ^ PPCUniversalConfiguration new
+    | options |
+
+    options := PPCCompilationOptions default.
+    options tokenize: false.
+    ^ PPCConfiguration new
+        options: options;
+        yourself
+
+    "Modified: / 04-09-2015 / 16:21:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCConfiguration methodsFor:'accessing'!
@@ -54,14 +70,67 @@
 
 ir: whatever
     ir := whatever
+!
+
+options
+    ^ context options
+
+    "Modified: / 26-08-2015 / 19:48:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+options: aPPCCompilationOptions
+    context options: aPPCCompilationOptions
+
+    "Created: / 26-08-2015 / 19:56:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+passes
+    ^ passes
+!
+
+passes:aCollection
+    passes := aCollection asOrderedCollection
+
+    "Modified: / 04-09-2015 / 14:14:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCConfiguration methodsFor:'accessing - defaults'!
 
-defaultParserSuperclass
-    self subclassResponsibility
+defaultPassesForTokenizingParser
+    ^  {
+        PPCTokenDetector .
+        PPCCacheFirstFollowPass .
+        PPCLL1Visitor .
+        PPCTokenizingVisitor .
+        PPCMergingVisitor .
+        PPCSpecializingVisitor .
+        PPCInliningVisitor .
+        PPCMergingVisitor .
+        PPCCheckingVisitor .
+        PPCCacheFirstFollowPass .
+        PPCTokenizingCodeGenerator .
+        PPCFSAVisitor .
+        PPCTokenCodeGenerator .
+        PPCScannerCodeGenerator .    
+    } asOrderedCollection.
 
-    "Created: / 01-09-2015 / 08:46:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 04-09-2015 / 15:56:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+defaultPassesForUniversalParser
+    ^ {
+        PPCTokenDetector.
+        PPCCacheFirstFollowPass. 
+        PPCSpecializingVisitor .
+        PPCRecognizerComponentDetector .
+        PPCSpecializingVisitor .
+        PPCInliningVisitor .
+        PPCMergingVisitor .
+        PPCCheckingVisitor .
+        PPCUniversalCodeGenerator
+    } asOrderedCollection.
+
+    "Created: / 04-09-2015 / 15:56:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCConfiguration methodsFor:'compiling'!
@@ -100,9 +169,15 @@
     context options generate ifFalse:[
         ^ self
     ].
+    context parserClass methodDictionary isEmpty ifTrue:[ 
+        ^ self
+    ].
+
     parserSuper := context options parserSuperclass.
     parserSuper isNil ifTrue:[ 
-        parserSuper := self defaultParserSuperclass.
+        parserSuper := context options tokenize 
+                        ifTrue:[ PPTokenizingCompiledParser ]
+                        ifFalse:[ PPCompiledParser ]   
     ].
     rootMethod := context parserClass propertyAt:#rootMethod.
     context parserClass name:context options parserName.
@@ -113,7 +188,7 @@
     ir := parserClass new
 
     "Modified: / 25-08-2015 / 00:05:49 / Jan Vrany"
-    "Modified: / 01-09-2015 / 08:46:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:07:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 generateScanner
@@ -122,6 +197,10 @@
     context options generate ifFalse:[
         ^ self
     ].
+    context scannerClass methodDictionary isEmpty ifTrue:[ 
+        ^ self
+    ].
+
     context scannerClass name:context options scannerName.
     context scannerClass superclass:context options scannerSuperclass.
     scanner := (self buildClass:context scannerClass).
@@ -130,11 +209,18 @@
     self remember:scanner as:#scanner
 
     "Modified: / 25-08-2015 / 00:06:49 / Jan Vrany"
-    "Modified: / 26-08-2015 / 19:58:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:33:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 invokePhases
-    self subclassResponsibility
+    self initializePassesIfNotAlready.
+
+    self runPasses: passes.
+
+    self generateScanner.
+    self generateParser.
+
+    "Modified: / 04-09-2015 / 16:22:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCConfiguration methodsFor:'debugging'!
@@ -164,27 +250,25 @@
     "Modified: / 28-08-2015 / 14:14:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!PPCConfiguration methodsFor:'error handling'!
-
-options
-    ^ context options
-
-    "Modified: / 26-08-2015 / 19:48:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-options: aPPCCompilationOptions
-    context options: aPPCCompilationOptions
-
-    "Created: / 26-08-2015 / 19:56:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !PPCConfiguration methodsFor:'initialization'!
 
 initialize
     history := OrderedCollection new.
     context := PPCCompilationContext new.
 
-    "Modified: / 26-08-2015 / 19:49:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:56:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+initializePassesIfNotAlready
+    passes isNil ifTrue:[ 
+        context options tokenize ifTrue:[ 
+            passes := self defaultPassesForTokenizingParser
+        ] ifFalse:[ 
+            passes := self defaultPassesForUniversalParser
+        ].
+    ].
+
+    "Created: / 04-09-2015 / 16:02:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCConfiguration methodsFor:'reporting'!
@@ -199,6 +283,21 @@
 
 !PPCConfiguration methodsFor:'running'!
 
+removePass: pass
+    | index |
+
+    self initializePassesIfNotAlready.
+    [ 
+        index := passes indexOf: pass.
+        index ~~ 0
+    ] whileTrue:[ 
+        passes removeAtIndex: index
+    ].
+
+    "Created: / 04-09-2015 / 11:24:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:02:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 runPass: pass
     | p |
 
@@ -208,5 +307,11 @@
 
     "Created: / 26-08-2015 / 22:35:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 29-08-2015 / 07:16:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+runPasses: aCollection
+    aCollection do:[:each | self runPass: each  ]
+
+    "Created: / 04-09-2015 / 11:23:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- a/compiler/PPCPluggableConfiguration.st	Sat Aug 29 07:56:14 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-"{ Package: 'stx:goodies/petitparser/compiler' }"
-
-"{ NameSpace: Smalltalk }"
-
-Object subclass:#PPCPluggableConfiguration
-	instanceVariableNames:'block base'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'PetitCompiler-Core'
-!
-
-!PPCPluggableConfiguration class methodsFor:'as yet unclassified'!
-
-on: aBlock
-    ^ self on: aBlock base: PPCConfiguration default
-!
-
-on: aBlock base: aPPCCOnfiguration
-    ^ self new
-        block: aBlock;
-        base: aPPCCOnfiguration;
-        yourself
-! !
-
-!PPCPluggableConfiguration methodsFor:'as yet unclassified'!
-
-base: aPPCConfiguration
-    base := aPPCConfiguration
-!
-
-block: aBlock
-    block := aBlock
-!
-
-compile: whatever
-    base input: whatever.
-    block value: base.
-    ^ base ir
-!
-
-input: whatever
-    ^ base input: whatever
-!
-
-invokePhases
-    ^ block value: base
-!
-
-options: args
-    ^ base context options: args
-
-    "Modified: / 28-08-2015 / 14:19:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
--- a/compiler/PPCTokenizingConfiguration.st	Sat Aug 29 07:56:14 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-"{ Package: 'stx:goodies/petitparser/compiler' }"
-
-"{ NameSpace: Smalltalk }"
-
-PPCConfiguration subclass:#PPCTokenizingConfiguration
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'PetitCompiler-Core'
-!
-
-!PPCTokenizingConfiguration methodsFor:'accessing - defaults'!
-
-defaultParserSuperclass
-    ^ PPTokenizingCompiledParser
-
-    "Modified (comment): / 01-09-2015 / 08:48:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!PPCTokenizingConfiguration methodsFor:'compiling'!
-
-invokePhases
-
-    self runPass: PPCTokenDetector.
-
-    context options cacheFirstFollow ifTrue:[
-        self runPass: PPCCacheFirstFollowPass  
-    ].  
-    self runPass: PPCLL1Visitor.
-    context options tokenize ifTrue:[
-        self runPass: PPCTokenizingVisitor    
-    ].
-
-    self runPass: PPCMergingVisitor .
-
-    context options specialize ifTrue:[
-        self runPass: PPCSpecializingVisitor
-    ].
-
-    self runPass: PPCRecognizerComponentDetector .
-
-    context options specialize ifTrue:[
-        self runPass: PPCSpecializingVisitor
-    ].
-    context options inline ifTrue:[
-        self runPass: PPCInliningVisitor     
-    ]. 
-
-    self runPass: PPCMergingVisitor .
-
-    self runPass: PPCCheckingVisitor.
-    context options cacheFirstFollow ifTrue:[
-        self runPass: PPCCacheFirstFollowPass  
-    ].  
-    self runPass: PPCTokenizingCodeGenerator.
-    self runPass: PPCFSAVisitor.
-    self runPass: PPCTokenCodeGenerator.
-    self runPass: PPCScannerCodeGenerator.  
-
-    self generateScanner.
-    self generateParser.
-
-    "Modified: / 04-09-2015 / 10:25:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
--- a/compiler/PPCUniversalConfiguration.st	Sat Aug 29 07:56:14 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-"{ Package: 'stx:goodies/petitparser/compiler' }"
-
-"{ NameSpace: Smalltalk }"
-
-PPCConfiguration subclass:#PPCUniversalConfiguration
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'PetitCompiler-Core'
-!
-
-
-!PPCUniversalConfiguration methodsFor:'accessing - defaults'!
-
-defaultParserSuperclass
-    ^ PPCompiledParser
-
-    "Modified: / 01-09-2015 / 08:47:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!PPCUniversalConfiguration methodsFor:'compiling'!
-
-invokePhases
-
-    self runPass: PPCTokenDetector.
-
-    context options cacheFirstFollow ifTrue:[
-        self runPass: PPCCacheFirstFollowPass  
-    ].  
-    context options specialize ifTrue:[
-        self runPass: PPCSpecializingVisitor
-    ].  
-
-    self runPass: PPCRecognizerComponentDetector .
-
-    context options specialize ifTrue:[
-        self runPass: PPCSpecializingVisitor
-    ].
-    context options inline ifTrue:[
-        self runPass: PPCInliningVisitor     
-    ].
-
-    self runPass: PPCMergingVisitor.
-
-    self runPass: PPCCheckingVisitor.
-
-    self runPass: PPCUniversalCodeGenerator. 
-
-    self generateParser.
-
-    "Modified: / 04-09-2015 / 10:25:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!PPCUniversalConfiguration class methodsFor:'documentation'!
-
-version
-    ^ 'Path: stx/goodies/petitparser/compiler/PPCUniversalConfiguration.st, Version: 1.0, User: jv, Time: 2015-08-26T20:03:52.218+01'
-!
-
-version_HG
-    ^ 'Path: stx/goodies/petitparser/compiler/PPCUniversalConfiguration.st, Version: 1.0, User: jv, Time: 2015-08-26T20:03:52.218+01'
-! !
-
--- a/compiler/abbrev.stc	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/abbrev.stc	Fri Sep 04 14:06:56 2015 +0100
@@ -31,7 +31,6 @@
 PPCNode PPCNode stx:goodies/petitparser/compiler 'PetitCompiler-Nodes' 0
 PPCNodeVisitor PPCNodeVisitor stx:goodies/petitparser/compiler 'PetitCompiler-Visitors' 0
 PPCPass PPCPass stx:goodies/petitparser/compiler 'PetitCompiler-Core' 0
-PPCPluggableConfiguration PPCPluggableConfiguration stx:goodies/petitparser/compiler 'PetitCompiler-Core' 0
 PPCScanner PPCScanner stx:goodies/petitparser/compiler 'PetitCompiler-Scanner' 0
 PPCScannerError PPCScannerError stx:goodies/petitparser/compiler 'PetitCompiler-Exceptions' 1
 PPCScannerResultStrategy PPCScannerResultStrategy stx:goodies/petitparser/compiler 'PetitCompiler-Scanner' 0
@@ -66,9 +65,7 @@
 PPCProfilingContext PPCProfilingContext stx:goodies/petitparser/compiler 'PetitCompiler-Context' 0
 PPCScannerCodeGenerator PPCScannerCodeGenerator stx:goodies/petitparser/compiler 'PetitCompiler-Scanner' 0
 PPCTokenizingCodeGen PPCTokenizingCodeGen stx:goodies/petitparser/compiler 'PetitCompiler-Compiler-Codegen' 0
-PPCTokenizingConfiguration PPCTokenizingConfiguration stx:goodies/petitparser/compiler 'PetitCompiler-Core' 0
 PPCUniversalCodeGen PPCUniversalCodeGen stx:goodies/petitparser/compiler 'PetitCompiler-Compiler-Codegen' 0
-PPCUniversalConfiguration PPCUniversalConfiguration stx:goodies/petitparser/compiler 'PetitCompiler-Core' 0
 PPCUniversalResultStrategy PPCUniversalResultStrategy stx:goodies/petitparser/compiler 'PetitCompiler-Scanner' 0
 PPCUnknownNode PPCUnknownNode stx:goodies/petitparser/compiler 'PetitCompiler-Nodes' 0
 PPTokenizingCompiledParser PPTokenizingCompiledParser stx:goodies/petitparser/compiler 'PetitCompiler-Parsers' 4
--- a/compiler/bc.mak	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/bc.mak	Fri Sep 04 14:06:56 2015 +0100
@@ -102,7 +102,6 @@
 $(OUTDIR)PPCNode.$(O) PPCNode.$(H): PPCNode.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCNodeVisitor.$(O) PPCNodeVisitor.$(H): PPCNodeVisitor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCPass.$(O) PPCPass.$(H): PPCPass.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)PPCPluggableConfiguration.$(O) PPCPluggableConfiguration.$(H): PPCPluggableConfiguration.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScanner.$(O) PPCScanner.$(H): PPCScanner.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerError.$(O) PPCScannerError.$(H): PPCScannerError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerResultStrategy.$(O) PPCScannerResultStrategy.$(H): PPCScannerResultStrategy.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -137,9 +136,7 @@
 $(OUTDIR)PPCProfilingContext.$(O) PPCProfilingContext.$(H): PPCProfilingContext.st $(INCLUDE_TOP)\stx\goodies\petitparser\PPStream.$(H) $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCContext.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\PeekableStream.$(H) $(INCLUDE_TOP)\stx\libbasic\PositionableStream.$(H) $(INCLUDE_TOP)\stx\libbasic\ReadStream.$(H) $(INCLUDE_TOP)\stx\libbasic\Stream.$(H) $(STCHDR)
 $(OUTDIR)PPCScannerCodeGenerator.$(O) PPCScannerCodeGenerator.$(H): PPCScannerCodeGenerator.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCPass.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCTokenizingCodeGen.$(O) PPCTokenizingCodeGen.$(H): PPCTokenizingCodeGen.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCCodeGen.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)PPCTokenizingConfiguration.$(O) PPCTokenizingConfiguration.$(H): PPCTokenizingConfiguration.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCConfiguration.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUniversalCodeGen.$(O) PPCUniversalCodeGen.$(H): PPCUniversalCodeGen.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCCodeGen.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)PPCUniversalConfiguration.$(O) PPCUniversalConfiguration.$(H): PPCUniversalConfiguration.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCConfiguration.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUniversalResultStrategy.$(O) PPCUniversalResultStrategy.$(H): PPCUniversalResultStrategy.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCScannerResultStrategy.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPCUnknownNode.$(O) PPCUnknownNode.$(H): PPCUnknownNode.st $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCNode.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)PPTokenizingCompiledParser.$(O) PPTokenizingCompiledParser.$(H): PPTokenizingCompiledParser.st $(INCLUDE_TOP)\stx\goodies\petitparser\PPParser.$(H) $(INCLUDE_TOP)\stx\goodies\petitparser\compiler\PPCompiledParser.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
--- a/compiler/benchmarks/PPCSmalltalkNoopParser.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/benchmarks/PPCSmalltalkNoopParser.st	Fri Sep 04 14:06:56 2015 +0100
@@ -9,7 +9,6 @@
 	category:'PetitCompiler-Benchmarks-Parsers'
 !
 
-
 !PPCSmalltalkNoopParser methodsFor:'accessing'!
 
 startExpression
@@ -343,10 +342,3 @@
     "Modified: / 15-05-2015 / 08:54:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!PPCSmalltalkNoopParser class methodsFor:'documentation'!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-! !
-
--- a/compiler/libInit.cc	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/libInit.cc	Fri Sep 04 14:06:56 2015 +0100
@@ -57,7 +57,6 @@
 _PPCNode_Init(pass,__pRT__,snd);
 _PPCNodeVisitor_Init(pass,__pRT__,snd);
 _PPCPass_Init(pass,__pRT__,snd);
-_PPCPluggableConfiguration_Init(pass,__pRT__,snd);
 _PPCScanner_Init(pass,__pRT__,snd);
 _PPCScannerError_Init(pass,__pRT__,snd);
 _PPCScannerResultStrategy_Init(pass,__pRT__,snd);
@@ -92,9 +91,7 @@
 _PPCProfilingContext_Init(pass,__pRT__,snd);
 _PPCScannerCodeGenerator_Init(pass,__pRT__,snd);
 _PPCTokenizingCodeGen_Init(pass,__pRT__,snd);
-_PPCTokenizingConfiguration_Init(pass,__pRT__,snd);
 _PPCUniversalCodeGen_Init(pass,__pRT__,snd);
-_PPCUniversalConfiguration_Init(pass,__pRT__,snd);
 _PPCUniversalResultStrategy_Init(pass,__pRT__,snd);
 _PPCUnknownNode_Init(pass,__pRT__,snd);
 _PPTokenizingCompiledParser_Init(pass,__pRT__,snd);
--- a/compiler/stx_goodies_petitparser_compiler.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/stx_goodies_petitparser_compiler.st	Fri Sep 04 14:06:56 2015 +0100
@@ -140,7 +140,6 @@
         PPCNode
         PPCNodeVisitor
         PPCPass
-        PPCPluggableConfiguration
         PPCScanner
         PPCScannerError
         PPCScannerResultStrategy
@@ -175,9 +174,7 @@
         PPCProfilingContext
         PPCScannerCodeGenerator
         PPCTokenizingCodeGen
-        PPCTokenizingConfiguration
         PPCUniversalCodeGen
-        PPCUniversalConfiguration
         PPCUniversalResultStrategy
         PPCUnknownNode
         PPTokenizingCompiledParser
--- a/compiler/tests/PPCCodeGeneratorTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCCodeGeneratorTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -24,20 +24,20 @@
 !
 
 setUp
-    options := PPCCompilationOptions default
-        profile: true.
+    options := PPCCompilationOptions default 
+                tokenize: false; 
+                profile: true;
+                yourself.
         
-    configuration := PPCPluggableConfiguration on: [ :_self | 
-        options cacheFirstFollow ifTrue:[ 
-            _self runPass: PPCCacheFirstFollowPass.
-        ].
-        _self runPass: PPCCheckingVisitor.
-        _self runPass: PPCUniversalCodeGenerator.
-        _self generateParser.
-    ].
+    configuration := PPCConfiguration new passes:
+            {
+                PPCCacheFirstFollowPass.
+                PPCCheckingVisitor .
+                PPCUniversalCodeGenerator .
+            }.
     configuration options: options.
 
-    "Modified: / 04-09-2015 / 10:31:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:22:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
@@ -928,7 +928,7 @@
 !
 
 testStarAnyNode
-    options cacheFirstFollow: false.
+    configuration removePass: PPCCacheFirstFollowPass.
     node := PPCStarAnyNode new 
         child: PPCNilNode new; 
         yourself.
@@ -937,10 +937,12 @@
     self assert: parser parse: 'abc' to: #($a $b $c).
     self assert: parser parse: 'a' to: #($a).
     self assert: parser parse: '' to: #().
+
+    "Modified: / 04-09-2015 / 14:47:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testStarCharSetPredicateNode
-    options cacheFirstFollow: false.
+    configuration removePass: PPCCacheFirstFollowPass.
     node := PPCStarCharSetPredicateNode new
         predicate: (PPCharSetPredicate on: [:e | e = $a ]);
         child: PPCSentinelNode new;
@@ -953,11 +955,12 @@
     self assert: context invocationCount = 1.
     self assert: parser parse: 'bba' to: #() end: 0.
     self assert: context invocationCount = 1.
-    
+
+    "Modified: / 04-09-2015 / 14:47:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testStarMessagePredicateNode
-    options cacheFirstFollow: false.
+    configuration removePass: PPCCacheFirstFollowPass.
     node := PPCStarMessagePredicateNode new
         message: #isLetter;
         child: PPCSentinelNode new;
@@ -971,7 +974,8 @@
     
     self assert: parser parse: '123a' to: #() end: 0.
     self assert: context invocationCount = 1.
-    
+
+    "Modified: / 04-09-2015 / 14:48:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testStarNode
@@ -1035,8 +1039,8 @@
         message: #isLetter; 
         child: PPCSentinelNode new; 
         yourself.
-    options cacheFirstFollow: false.
-    options guards: false.	
+    configuration removePass: PPCCacheFirstFollowPass.
+    options guards: false.      
     self compileTree: node.
     
     self assert: parser class methodDictionary size = 1.
@@ -1048,6 +1052,8 @@
     self assert: context rememberCount = 0.
     
     self assert: parser parse: 'foo123' to: parser end: 3.
+
+    "Modified: / 04-09-2015 / 14:48:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testTokenStarSeparatorNode
@@ -1060,14 +1066,15 @@
     node := PPCForwardNode new
         child: starNode;
         yourself.
-    options cacheFirstFollow: false.
+    configuration removePass: PPCCacheFirstFollowPass.
     self compileTree: node.
     
     self assert: parser class methodDictionary size = 2.
     
     self assert: parser parse: '   a' to: parser end: 3.
     self assert: context invocationCount = 2.
-    
+
+    "Modified: / 04-09-2015 / 14:48:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testTokenStarSeparatorNode2
@@ -1080,15 +1087,16 @@
         yourself.
     node := PPCForwardNode new
         child: starNode;
-        yourself.	
-    options cacheFirstFollow: false.
+        yourself.       
+    configuration removePass: PPCCacheFirstFollowPass.
     self compileTree: node.
     
     self assert: parser class methodDictionary size = 1.
     
     self assert: parser parse: '   a' to: context end: 3.
     self assert: context invocationCount = 1.
-    
+
+    "Modified: / 04-09-2015 / 14:48:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testTrimNode
--- a/compiler/tests/PPCLTokenizingOptimizationTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCLTokenizingOptimizationTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -17,11 +17,13 @@
 !
 
 configuration
-    configuration := PPCTokenizingConfiguration new.
-    configuration context options generate: false.
+    configuration := PPCConfiguration new.
+    configuration context options 
+        generate: false;
+        tokenize: true.
     ^ configuration
 
-    "Modified: / 28-08-2015 / 14:17:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 optimize: aPPParser
--- a/compiler/tests/PPCNodeFirstFollowNextTests.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCNodeFirstFollowNextTests.st	Fri Sep 04 14:06:56 2015 +0100
@@ -164,7 +164,7 @@
 !
 
 testFirstNegate1
-    configuration context options specialize: true.
+    configuration removePass: PPCSpecializingVisitor.
     tree := self treeFrom: ('a' asParser negate, 'b' asParser).
     
     first := self first: tree.
@@ -173,7 +173,7 @@
     self assert: first anyMatchesType: PPCNotNode.
     self assert: first anyOne child literal = 'a'.
 
-    "Modified: / 28-08-2015 / 14:18:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 14:55:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testFirstNot
@@ -187,7 +187,7 @@
 !
 
 testFirstNot2
-    configuration context options specialize: true.
+    configuration removePass: PPCSpecializingVisitor.
     tree := self treeFrom: (#letter asParser not star, #letter asParser).
     
     first := self first: tree.
@@ -196,7 +196,7 @@
     self assert: first anyMatchesType: PPCNotNode.
     self assert: first anyMatchesType: PPCPredicateNode.
 
-    "Modified: / 28-08-2015 / 14:18:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 14:55:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testFirstNot4
@@ -329,13 +329,13 @@
 !
 
 testFirstSequence6
-    configuration context options specialize: true.
+    configuration removePass: PPCSpecializingVisitor.
     tree := self treeFrom: #space asParser star, 'a' asParser.
     
     tree firstFollowCache: nil.
     self should: [ self first: tree. ] raise: Exception.
 
-    "Modified: / 28-08-2015 / 14:18:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 14:55:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testFirstSequence7
@@ -359,7 +359,6 @@
 !
 
 testFirstStarMessagePredicate2
-    configuration context options specialize: true.
     tree := self treeFrom: #space asParser star.
     
     first := self first: tree.
@@ -368,11 +367,10 @@
     self assert: first anyMatchesType: PPCMessagePredicateNode.
     self assert: first anyMatchesType: PPCSentinelNode.
 
-    "Modified: / 28-08-2015 / 14:18:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:00:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testFirstTerminal
-    configuration context options specialize: true.
     tree := self treeFrom: 'a' asParser not.
 
     first := self first: tree.
@@ -380,7 +378,7 @@
     self assert: first size: 1.
     self assert: (self first: tree) anyMatchesType: PPCNotLiteralNode.
 
-    "Modified: / 28-08-2015 / 14:18:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:00:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testFirstTerminal2
@@ -669,7 +667,7 @@
 
 testFollowTrimmingToken
     | token1 token2 |
-    configuration context options specialize: false.
+    configuration removePass: PPCSpecializingVisitor.
     token1 := #letter asParser plus trimmingToken name: 'token1'; yourself.
     token2 := #letter asParser plus trimmingToken name: 'token2'; yourself.
     
@@ -682,7 +680,7 @@
     self assert: followSet size: 1.
     self assert: followSet anyMatchesType: PPCTrimmingTokenNode.
 
-    "Modified: / 28-08-2015 / 14:18:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 14:55:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCNodeFirstFollowNextTests class methodsFor:'documentation'!
--- a/compiler/tests/PPCOptimizeChoicesTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCOptimizeChoicesTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -22,14 +22,19 @@
     visitor := PPCOptimizeChoices new.
     
     options := PPCCompilationOptions default
-        profile: true.
+                    profile: true;
+                    generate: false;
+                    tokenize: false;
+                    yourself.
                 
-    configuration := PPCPluggableConfiguration on: [ :_self | 
-        _self runPass: PPCCacheFirstFollowPass.
-    ].
+    configuration := PPCConfiguration new.
+    configuration passes: 
+                        {
+                            PPCCacheFirstFollowPass.
+                        }.
     configuration options: options.
 
-    "Modified: / 29-08-2015 / 07:30:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testHasCommonPrefix
--- a/compiler/tests/PPCOverlappingTokensTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCOverlappingTokensTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -44,9 +44,10 @@
 setUp
     options := PPCCompilationOptions default
         profile: true;
+        tokenize: true;
         yourself.
         
-    configuration := PPCTokenizingConfiguration new.
+    configuration := PPCConfiguration new.
     configuration context options: options.
         
     self cleanClass.
@@ -57,7 +58,7 @@
     keywordToken := (#word asParser plus, $: asParser) token trim name: 'kw'; yourself.
     assignmentToken := (':=' asParser) token trim name: 'assignment'; yourself.
 
-    "Modified: / 28-08-2015 / 14:19:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
--- a/compiler/tests/PPCTokenizingCodeGeneratorTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCTokenizingCodeGeneratorTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -37,23 +37,23 @@
 setUp
     options := PPCCompilationOptions default
         profile: true;
+        tokenize: true;
         yourself.       
 
     self cleanClass.
     
-    configuration := PPCPluggableConfiguration on: [ :_self | 
-        _self runPass: PPCCacheFirstFollowPass.
-        _self runPass: PPCTokenizingCodeGenerator. 
-        _self runPass: PPCFSAVisitor.
-        _self runPass: PPCTokenCodeGenerator.
-        _self runPass: PPCScannerCodeGenerator.        
-        _self generateScanner.
-        _self generateParser.
-    ] base: PPCConfiguration tokenizing.
+    configuration := PPCConfiguration new.
+    configuration passes: {
+        PPCCacheFirstFollowPass.
+        PPCTokenizingCodeGenerator. 
+        PPCFSAVisitor.
+        PPCTokenCodeGenerator.
+        PPCScannerCodeGenerator.        
+    }.
 
     configuration options: options.
 
-    "Modified: / 03-09-2015 / 22:34:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
--- a/compiler/tests/PPCTokenizingTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCTokenizingTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -46,14 +46,15 @@
 setUp
     options := PPCCompilationOptions default
         profile: true;
+        tokenize: true;
         yourself.
         
-    configuration := PPCTokenizingConfiguration new.
+    configuration := PPCConfiguration new.
     configuration context options: options.
 
     self cleanClass.
 
-    "Modified: / 28-08-2015 / 14:20:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
@@ -482,8 +483,8 @@
 
 testWhitespace
     | token ws trimmingToken |
-    options inline: false.
-    
+
+    configuration removePass: PPCInliningVisitor.    
     token := 'foo' asParser token.
     ws := #blank asParser star name: 'consumeWhitespace'; yourself.
     trimmingToken := ((ws, token, ws) ==> #second) 
@@ -498,13 +499,13 @@
 
     self assert: (context invocations select: [:e | e = #scan_consumeWhitespace ]) size = 3.
 
-    "Modified: / 04-09-2015 / 06:13:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:02:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testWhitespace2
     | token ws trimmingToken |
-    options inline: false.
-        
+
+    configuration removePass: PPCInliningVisitor.    
     token := 'foo' asParser token.
     ws := #blank asParser star name: 'consumeWhitespace'; yourself.
     trimmingToken := ((ws, token, ws) ==> #second) 
@@ -520,13 +521,13 @@
 
     self assert: (context invocations select: [:e | e = #scan_consumeWhitespace ]) size = 4.
 
-    "Modified: / 04-09-2015 / 06:13:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:02:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 testWhitespace3
     | token ws trimmingToken |
-    options inline: false.
-        
+
+    configuration removePass: PPCInliningVisitor.    
     token := 'foo' asParser token.
     ws := #blank asParser star name: 'consumeWhitespace'; yourself.
     trimmingToken := ((ws, token, ws) ==> #second) 
@@ -543,6 +544,6 @@
 
     self assert: (context invocations select: [:e | e = #scan_consumeWhitespace ]) size = 5.
 
-    "Modified: / 04-09-2015 / 06:13:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:02:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
--- a/compiler/tests/PPCUnivarsalGuardTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCUnivarsalGuardTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -24,12 +24,13 @@
 setUp
     options := PPCCompilationOptions default
         profile: true;
+        tokenize: false;
         yourself.
         
-    configuration := PPCUniversalConfiguration new.
+    configuration := PPCConfiguration new.
     configuration context options: options
 
-    "Modified: / 28-08-2015 / 14:22:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 tearDown
--- a/compiler/tests/PPCUniversalOptimizationTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCUniversalOptimizationTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -22,20 +22,12 @@
 setUp
     super setUp.
     
-    configuration := PPCUniversalConfiguration new.
-    configuration context options generate: false.
-    
-"       ^ configuration := PPCPluggableConfiguration on:
-        [ :_self |
-            _self toPPCIr.
-            _self createTokens.
-            _self specialize.
-            _self createRecognizingComponents.
-            _self inline.
-            _self merge.                
-        ]"
+    configuration := PPCConfiguration new.
+    configuration context options 
+        generate: false;
+        tokenize: false.
 
-    "Modified: / 28-08-2015 / 14:22:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCUniversalOptimizationTest methodsFor:'tests'!
--- a/compiler/tests/PPCUniversalTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/PPCUniversalTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -572,12 +572,13 @@
     options := PPCCompilationOptions default
         profile: true;
         debug: true;
+        tokenize: false;
         yourself.
         
-    configuration := PPCUniversalConfiguration new.
+    configuration := PPCConfiguration new.
     configuration context options: options
 
-    "Modified: / 28-08-2015 / 14:22:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 16:21:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !PPCUniversalTest class methodsFor:'documentation'!
--- a/compiler/tests/extras/PPCLRPCompiledParserSmokeTest.st	Sat Aug 29 07:56:14 2015 +0100
+++ b/compiler/tests/extras/PPCLRPCompiledParserSmokeTest.st	Fri Sep 04 14:06:56 2015 +0100
@@ -42,9 +42,10 @@
 
     ^ (self petitParserClass name , 'C_' , 
             "This is bit hacky!!"
-            ((self compilerConfiguration isKindOf: PPCTokenizingConfiguration) ifTrue:[ 'Tokenizing' ] ifFalse:[ 'Universal' ])) asSymbol
+            ((self compilerConfiguration options tokenize) ifTrue:[ 'Tokenizing' ] ifFalse:[ 'Universal' ])) asSymbol
 
     "Created: / 29-07-2015 / 16:54:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 04-09-2015 / 15:44:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 compilerConfiguration