compiler/PPCTokenizingConfiguration.st
changeset 515 b5316ef15274
parent 464 f6d77fee9811
child 516 3b81c9e53352
child 524 f6f68d32de73
--- a/compiler/PPCTokenizingConfiguration.st	Fri Jul 24 15:06:54 2015 +0100
+++ b/compiler/PPCTokenizingConfiguration.st	Mon Aug 17 12:13:16 2015 +0100
@@ -3,7 +3,7 @@
 "{ NameSpace: Smalltalk }"
 
 PPCConfiguration subclass:#PPCTokenizingConfiguration
-	instanceVariableNames:''
+	instanceVariableNames:'codeGen'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'PetitCompiler-Core'
@@ -11,6 +11,18 @@
 
 !PPCTokenizingConfiguration methodsFor:'compiling'!
 
+buildClass: compiler
+    |  builder |
+    builder := PPCClassBuilder new.
+    
+    builder compiledClassName: arguments parserName.
+    builder compiledSuperclass: PPTokenizingCompiledParser.
+    builder methodDictionary: compiler methodDictionary.
+    builder constants: compiler constants.
+
+    ^ builder compileClass.	
+!
+
 invokePhases
     self toPPCIr.
     self createTokens.
@@ -25,11 +37,17 @@
     self merge.
     self check.	
     self cacheFirstFollow.
+    self generateScanner.		"Please note that codeGen is shared between these two phases"
     self generate.
 ! !
 
 !PPCTokenizingConfiguration methodsFor:'hooks'!
 
+codeCompiler
+    codeGen isNil ifTrue: [ codeGen := PPCTokenizingCodeGen on: arguments ].
+    ^ codeGen
+!
+
 codeCompilerOn: args
     ^ PPCTokenizingCompiler on: args
 !
@@ -47,6 +65,19 @@
     self remember: #LL1
 !
 
+generateScanner
+    | generator scanner |
+    generator :=  PPCTokenCodeGenerator new
+        compiler: self codeCompiler;
+        arguments: arguments;
+        yourself.
+
+    generator visit: ir.
+    
+    scanner := generator compileScanner.	
+    self codeCompiler addConstant: scanner as: #scannerClass.
+!
+
 tokenize
     "
         This will try transform the parser into the tokenizing parser