compiler/PPCTokenizingCodeGenerator.st
changeset 525 751532c8f3db
parent 516 3b81c9e53352
parent 524 f6f68d32de73
--- a/compiler/PPCTokenizingCodeGenerator.st	Tue Aug 18 22:46:10 2015 +0100
+++ b/compiler/PPCTokenizingCodeGenerator.st	Mon Aug 24 15:56:20 2015 +0100
@@ -3,140 +3,82 @@
 "{ NameSpace: Smalltalk }"
 
 PPCCodeGenerator subclass:#PPCTokenizingCodeGenerator
-	instanceVariableNames:'tokenGenerator'
+	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
-	category:'PetitCompiler-Visitors'
+	category:'PetitCompiler-Visitors-CodeGenerators'
 !
 
 
 !PPCTokenizingCodeGenerator methodsFor:'accessing'!
 
 guards
+    self flag: 'Hack alert, the codeGenerator needs refactoring so that we can remove this method'.
+    self halt: 'deprecated'.
     "When tokenizing, do not use guards"
     ^ false
-!
-
-tokenGenerator
-    self error: 'deprecated'.
-    
-    tokenGenerator isNil ifTrue: [ 
-        tokenGenerator := (PPCTokenCodeGenerator on: compiler)
-            arguments: arguments;
-            yourself.
-    ].
-    ^ tokenGenerator
-!
-
-tokenGenerator: whatever
-    tokenGenerator := whatever
-!
-
-tokenGuards
-    "When tokenizing, do not use guards"
-    ^ arguments guards
 ! !
 
-!PPCTokenizingCodeGenerator methodsFor:'guards'!
-
-addGuard: node ifTrue: trueBlock ifFalse: falseBlock
-    |  guard id |
-    guard := PPCTokenGuard on: node.
-    (self guards not or: guard makesSense not) ifTrue: [ ^ false ].
-    
-    id := compiler idFor: guard firstToken.
-
-    compiler add: 'self ', id asString.
+!PPCTokenizingCodeGenerator methodsFor:'initialization'!
 
-    trueBlock isNil ifFalse: [ 
-        compiler addOnLine: ' ifTrue: ['.
-        compiler indent.
-        trueBlock value.
-        compiler dedent.
-        falseBlock isNil 	ifTrue: [ compiler addOnLine: '].' ]
-                              		ifFalse: [ compiler add: ']'. ]
-    ].
-    falseBlock isNil ifFalse: [ 
-        compiler addOnLine: ' ifFalse: ['.
-        compiler indent.
-        falseBlock value.
-        compiler dedent.
-        compiler addOnLine: '].'.
-    ].
-    ^ true
-! !
-
-!PPCTokenizingCodeGenerator methodsFor:'scanner'!
-
-compileScanner
-    compiler addConstant: self tokenGenerator compileScanner as: #scannerClass.
+initialize
+    super initialize.
+    
+    codeGen := PPCTokenizingCodeGen new
 ! !
 
 !PPCTokenizingCodeGenerator methodsFor:'visiting'!
 
 visitAndNode: node
-    | mementoVar currentTokenVar |
+    | mementoVar  |
     
-    mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
-    currentTokenVar := compiler allocateTemporaryVariableNamed: 'currentToken'.
+    mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+    codeGen remember: node child to: mementoVar.
 
-    compiler smartRemember: node child to: mementoVar.
-    compiler codeAssign: '{ currentTokenValue . currentTokenType }.' to: currentTokenVar.
-
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
 
-    compiler smartRestore: node child from: mementoVar.
-    compiler codeAssign: '(', currentTokenVar, ' at: 1).' to: 'currentTokenValue'.
-    compiler codeAssign: '(', currentTokenVar, ' at: 2).' to: 'currentTokenType'.
-
-    compiler codeReturn.
+    codeGen restore: node child from: mementoVar.
+    codeGen codeReturn.
 !
 
 visitChoiceNode: node
 "       true ifTrue: [ ^ super visitChoiceNode: node ]."
-    | possibleError |
+    | possibleError memento |
     possibleError := true.
 
+    memento := codeGen allocateTemporaryVariableNamed: 'memento'.
+    codeGen codeScannerRememberTo: memento.
+
     node children do: [ :child |
         | tokenMethodName |
 
-        "TODO: JK: fix this in a proper way. Commented for now to make LRPParser cimpilable 
-         with tokenizing"
         child acceptsEpsilon "false" ifTrue: [  
             possibleError := false.
-            compiler codeIf: 'true' then: [ 
-                compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar.
-                compiler codeReturn
-            ].
+            codeGen codeEvaluateAndAssign:[ self visit:child ] to:self retvalVar.
+            codeGen codeReturn.
+            "makes no sense to compile more..."
+            ^ self
         ] ifFalse: [
             child firstSetWithTokens do: [ :first |
                 "For each child, for each first compile this:"
             
-                tokenMethodName := compiler idFor: first.
-                compiler add: '(self ', tokenMethodName asString, ')'.
-                compiler addOnLine: ' ifTrue: ['.
-                compiler indent.
-                    compiler codeAssignParsedValueOf:[ self visit:child ] to:self retvalVar.
-                    compiler add: 'error ifFalse: ['.
-                    compiler indent.
-                        compiler codeReturn: self retvalVar.
-                    compiler dedent.
-                    compiler add: '] ifTrue: ['.
-                    compiler indent.
-                        compiler codeClearError.
-                        compiler codeAssign: 'nil.' to: 'currentTokenType'.
-                        compiler add: 'context position: currentTokenValue start - 1.'.
-                    compiler dedent.
-                    compiler add: ']'.
-                compiler dedent.
-                compiler add: '].'
+                tokenMethodName := codeGen idFor: first.
+                codeGen codeIf: '(scanner ', tokenMethodName asString, ')' then: [ 
+                    codeGen codeEvaluateAndAssignParsedValueOf:[ self visit:child ] to:self retvalVar.
+                    codeGen codeIf: 'error' then: [ 
+                        codeGen codeClearError.
+                        codeGen codeScannerRestoreFrom: memento.
+                    ] else: [ 
+                        codeGen codeReturn: self retvalVar.
+                    ]
+                ]
             ]
         ]
     ].
     possibleError ifTrue: [
-        compiler codeError: 'no choice found'.
+        codeGen codeError: 'no choice found'.
     ]
 
     "Modified: / 31-07-2015 / 08:07:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -146,6 +88,7 @@
     | dictionary isInlined |
     dictionary := IdentityDictionary new.
     
+"	codeGen currentMethod methodName asSymbol = #'ch' ifTrue: [ self halt ]."
     isInlined := node isMarkedForInline.
     
     node children do: [ :child |
@@ -159,46 +102,31 @@
     
     node children do: [ :child |
         | tokenMethodName |
-        tokenMethodName := compiler idFor: (dictionary at: child).
-        compiler add: '(self ', tokenMethodName asString, ')'.
-        compiler addOnLine: ' ifTrue: ['.
-        compiler indent.
-        compiler codeReturnParsedValueOf:[ self visit:child ].
-        compiler dedent.
+        tokenMethodName := codeGen idFor: (dictionary at: child).
+        codeGen code: '(scanner ', tokenMethodName asString, ')'.
+        codeGen codeOnLine: ' ifTrue: ['.
+        codeGen indent.
+        codeGen codeReturnParsedValueOf:[ self visit:child ].
+        codeGen dedent.
         isInlined ifTrue:[
-            compiler add: '] ifFalse: ['
+            codeGen code: '] ifFalse: ['
         ] ifFalse:[
-            compiler add: '].'.
+            codeGen code: '].'.
         ]
     ].
-    compiler codeError: 'no choice found'.
+    codeGen codeError: 'no choice found'.
     isInlined ifTrue:[
-        node children size timesRepeat: [ compiler addOnLine: ']' ].
-        compiler addOnLine: '.'.
+        node children size timesRepeat: [ codeGen addOnLine: ']' ].
+        codeGen codeOnLine: '.'.
     ]
 
     "Modified: / 21-05-2015 / 15:31:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-visitTokenChoiceNode: node
-    | trimmingToken |
-    self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]).
-    
-    node children do: [ :child |
-        self tokenGenerator visit: child
-    ]
-    
-"	
-    trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
-    trimmingToken isNil ifFalse: [ 
-        compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever.
-    ].
-    super visitChoiceNode: node."
-!
-
 visitTokenConsumeNode: node
-    "dont do anything here"
-    ^ node
+    | id |
+    id := codeGen idFor: node.
+    codeGen codeReturn: 'scanner ', id, ' ifNil: [ error := true ].'.
 !
 
 visitTokenNode: node
@@ -206,13 +134,11 @@
 !
 
 visitTokenizingParserNode: node
-    self visit: node whitespace.
-    
-    compiler codeHaltIfShiftPressed.
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node parser ]
+    codeGen codeHaltIfShiftPressed.
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node parser ]
           to:self retvalVar.
-    compiler codeReturn.
+    codeGen codeReturn.
 !
 
 visitTrimmingTokenCharacterNode: node