compiler/PPCCodeGenerator.st
changeset 525 751532c8f3db
parent 516 3b81c9e53352
parent 524 f6f68d32de73
child 529 439c4057517f
--- a/compiler/PPCCodeGenerator.st	Tue Aug 18 22:46:10 2015 +0100
+++ b/compiler/PPCCodeGenerator.st	Mon Aug 24 15:56:20 2015 +0100
@@ -3,10 +3,10 @@
 "{ NameSpace: Smalltalk }"
 
 PPCNodeVisitor subclass:#PPCCodeGenerator
-	instanceVariableNames:'compiler'
+	instanceVariableNames:'codeGen'
 	classVariableNames:''
 	poolDictionaries:''
-	category:'PetitCompiler-Visitors'
+	category:'PetitCompiler-Visitors-CodeGenerators'
 !
 
 !PPCCodeGenerator class methodsFor:'as yet unclassified'!
@@ -25,8 +25,21 @@
 
 !PPCCodeGenerator methodsFor:'accessing'!
 
-compiler: aPPCCompiler
-    compiler := aPPCCompiler 
+arguments: args
+    super arguments: args.
+    codeGen arguments: args.
+!
+
+clazz: aPPCClass
+    codeGen clazz: aPPCClass
+!
+
+codeGen
+    ^ codeGen
+!
+
+codeGen: anObject
+    codeGen := anObject
 !
 
 guards
@@ -42,36 +55,36 @@
     children := choiceNode children.
     useGuards ifTrue:[
         self addGuard: (children at: choiceChildNodeIndex) ifTrue: [ 
-                    compiler add: 'self clearError.'.
-                    compiler 
-                          codeAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
+                    codeGen codeClearError.
+                    codeGen 
+                          codeEvaluateAndAssign:[ self visit:(children at: choiceChildNodeIndex) ]
                           to: resultVar.
-                    compiler add: 'error ifFalse: [ '.
-                    compiler codeReturn: resultVar.  
-                    compiler add: ' ].'.
+                    codeGen codeIf: 'error' then: nil else: [ 
+                        codeGen codeReturn: resultVar.  
+                    ].
                 ] ifFalse:[ 
-                    compiler add: 'error := true.'.
+                    codeGen code: 'error := true.'.
                 ].
-                compiler add: 'error ifTrue:[ '.
-                choiceChildNodeIndex < children size ifTrue:[ 
-                    self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
-                ] ifFalse:[ 
-                    compiler codeError: 'no choice suitable'.
+                codeGen codeIf: 'error' then: [ 
+                    choiceChildNodeIndex < children size ifTrue:[ 
+                        self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
+                    ] ifFalse:[ 
+                        codeGen codeError: 'no choice suitable'.
+                    ].
                 ].
-                compiler addOnLine: '].'.
     
     ] ifFalse:[ 
                 choiceChildNodeIndex <= children size ifTrue:[ 
-                    compiler add: 'self clearError.'.
-                    compiler 
-                          codeAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
+                    codeGen codeClearError.
+                    codeGen 
+                          codeEvaluateAndAssignParsedValueOf:[ self visit:(children at: choiceChildNodeIndex) ]
                           to: resultVar.
-                    compiler add: 'error ifFalse: [ '.
-                    compiler codeReturn: resultVar.  
-                    compiler add: ' ].'.
+                    codeGen codeIf: 'error' then: nil else: [ 
+                        codeGen codeReturn: resultVar.  
+                    ].
                     self generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex + 1 useGuards: useGuards storeResultInto: resultVar.
                 ] ifFalse:[ 
-                    compiler codeError: 'no choice suitable'.
+                    codeGen codeError: 'no choice suitable'.
                 ].
     ].
 
@@ -83,21 +96,21 @@
 
         child := sequenceNode children at: sequenceNodeChildIndex.
         childValueVar := elementVars at: sequenceNodeChildIndex.
-        compiler codeAssignParsedValueOf: [ self visit:child ] 
+        codeGen codeEvaluateAndAssign: [ self visit:child ] 
                                       to: childValueVar.
         child acceptsEpsilon ifFalse: [   
-            compiler codeIfErrorThen: [
+            codeGen codeIfErrorThen: [
                 "Handle error in the first element in a special way,
                  because one does not need to do backtracking  if the first element fails."
                 (sequenceNodeChildIndex == 1) ifTrue: [                         
-                    compiler codeReturn: 'failure'
+                    codeGen codeReturn: 'failure'
                 ] ifFalse: [
-                    compiler smartRestore: sequenceNode from: mementoVar.
-                    compiler codeReturn: 'failure.'.
+                    codeGen restore: sequenceNode from: mementoVar.
+                    codeGen codeReturn: 'failure.'.
                 ]
             ] else:[ 
                 sequenceNode returnParsedObjectsAsCollection ifTrue:[
-                    compiler add: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
+                    codeGen code: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
                 ].
                 (sequenceNodeChildIndex < sequenceNode children size) ifTrue:[ 
                     self generateSequenceChildOf: sequenceNode atIndex: sequenceNodeChildIndex + 1 useMememntoVar: mementoVar storeResultInto: elementVars.
@@ -106,7 +119,7 @@
 
         ] ifTrue:[
             sequenceNode returnParsedObjectsAsCollection ifTrue:[
-                compiler add: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
+                codeGen code: self retvalVar , ' at: ', sequenceNodeChildIndex asString, ' put: ', childValueVar, '.'.
             ].
             (sequenceNodeChildIndex < sequenceNode children size) ifTrue:[ 
                     self generateSequenceChildOf: sequenceNode atIndex: sequenceNodeChildIndex + 1 useMememntoVar: mementoVar storeResultInto: elementVars.
@@ -115,59 +128,6 @@
         ]
 ! !
 
-!PPCCodeGenerator methodsFor:'guards'!
-
-addGuard: node ifTrue: trueBlock ifFalse: falseBlock
-    |  guard id |
-    (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
-    id := compiler idFor: node.
-
-"	falseBlock isNil ifFalse: [ 
-        compiler add: 'context atEnd'.
-        compiler addOnLine: ' ifTrue: ['.
-        compiler indent.
-        falseBlock value.
-        compiler dedent.
-        compiler addOnLine: '].'.
-    ]."
-    
-    guard id: (compiler idFor: guard defaultName: #guard).
-    guard compileGuard: compiler.
-
-    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
-!
-
-addGuardTrimming: node
-    |  guard firsts id |
-    (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
-
-    id := compiler idFor: node.
-    firsts := node firstSetWithTokens.
-
-    
-    (firsts allSatisfy: [ :e | e isTrimmingTokenNode ]) ifTrue: [  
-        "If we start with trimming, we should invoke the whitespace parser"
-        self compileTokenWhitespace: firsts anyOne.
-        ^ true
-    ].
-    ^ false
-! !
-
 !PPCCodeGenerator methodsFor:'hooks'!
 
 afterAccept: node retval: retval
@@ -186,7 +146,7 @@
 !
 
 openDetected: node
-    ^ compiler checkCache: (compiler idFor: node)
+    ^ codeGen cachedMethod: (codeGen idFor: node)
 ! !
 
 !PPCCodeGenerator methodsFor:'private'!
@@ -230,14 +190,14 @@
         method isNil ifTrue:[
             PPCCompilationError new signalWith: 'oops, no method found (internal error)!!'.        
         ].
-        source := method source.
+        source := method sourceCode.
         source isNil ifTrue:[ 
             PPCCompilationError new signalWith: 'unavailable source for method ', method printString ,'!!'.        
         ].
         "Following actually copies the method to the target class,
          though the APU is not nice. This has to be cleaned up"
-        (compiler cachedValue: node selector) isNil ifTrue:[ 
-            compiler cache: node selector as: (PPCMethod new id: node selector; source: source; yourself).
+        (codeGen cachedMethod: node selector) isNil ifTrue:[ 
+            codeGen cacheMethod: (PPCMethod new id: node selector; source: source; yourself) as: node selector.
             "Now compile self-sends of the just copied method"
             self copySelfSentMethodsOf: method parseTree inClass: aClass
         ].
@@ -249,67 +209,65 @@
 !PPCCodeGenerator methodsFor:'support'!
 
 compileTokenWhitespace: node
-    compiler add: 'context atWs ifFalse: ['.
-    compiler indent.
-        compiler 
-              codeAssignParsedValueOf:[ self visit:node whitespace ]
+    codeGen codeIf: 'context atWs' then: nil else: [ 
+        codeGen 
+              codeEvaluateAndAssign:[ self visit:node whitespace ]
               to:#whatever.
-        compiler add: 'context setWs.'.
-    compiler dedent.
-    compiler add: '].'.
+        codeGen code: 'context setWs.'.
+    ]
 !
 
 notCharSetPredicateBody: node
     | classificationId  classification |
     self error: 'deprecated.'.
     classification := node extendClassification: node predicate classification.
-    classificationId := (compiler idFor: classification defaultName: #classification).
-    compiler  addConstant: classification as: classificationId.
+    classificationId := (codeGen idFor: classification defaultName: #classification).
+    codeGen  addConstant: classification as: classificationId.
     
-    compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
-    compiler indent.
-    compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
-    compiler add: ' ifFalse: [ nil ].'.
-    compiler dedent.
+    codeGen addOnLine: '(', classificationId, ' at: context peek asInteger)'.
+    codeGen indent.
+    codeGen add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
+    codeGen add: ' ifFalse: [ nil ].'.
+    codeGen dedent.
 !
 
 notMessagePredicateBody: node
     self error: 'deprecated'.
-    compiler addOnLine: '(context peek ', node message, ')'.
-    compiler indent.
-    compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
-    compiler add: ' ifFalse: [ nil ].'.
-    compiler dedent.
+    codeGen addOnLine: '(context peek ', node message, ')'.
+    codeGen indent.
+    codeGen add: ' ifTrue: [ self error: '' predicate not expected'' ]'.
+    codeGen add: ' ifFalse: [ nil ].'.
+    codeGen dedent.
 !
 
 predicateBody: node
     | tmpId |
     self error:'deprecated'.
-    tmpId := (compiler idFor: node predicate prefixed: #predicate).
-    compiler addConstant: node predicate as: tmpId.
+    tmpId := (codeGen idFor: node predicate prefixed: #predicate).
+    codeGen addConstant: node predicate as: tmpId.
 
-    compiler addOnLine: '(context atEnd not and: [ ', tmpId , ' value: context uncheckedPeek])'.
-    compiler indent.
-    compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'.
-    compiler add: 'ifTrue: [ context next ].'.
-    compiler dedent.	
+    codeGen addOnLine: '(context atEnd not and: [ ', tmpId , ' value: context uncheckedPeek])'.
+    codeGen indent.
+    codeGen add: 'ifFalse: [ self error: ''predicate not found'' ]'.
+    codeGen add: 'ifTrue: [ context next ].'.
+    codeGen dedent.	
 !
 
 retvalVar
-    ^ compiler currentReturnVariable
+    ^ codeGen currentReturnVariable
 
     "Modified: / 15-06-2015 / 18:20:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 startMethodForNode:node
     node isMarkedForInline ifTrue:[ 
-        compiler startInline: (compiler idFor: node).
-        compiler codeComment: 'BEGIN inlined code of ' , node printString.
-        compiler indent.
+        codeGen startInline: (codeGen idFor: node).
+        codeGen codeComment: 'BEGIN inlined code of ' , node printString.
+        codeGen indent.
     ] ifFalse:[ 
-        compiler startMethod: (compiler idFor: node).
-        compiler codeComment: 'GENERATED by ' , node printString.
-        compiler allocateReturnVariable.
+        codeGen startMethod: (codeGen idFor: node).
+        codeGen codeComment: 'GENERATED by ' , node printString.
+        codeGen allocateReturnVariable.
     ].
 
     "Created: / 23-04-2015 / 15:51:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -318,12 +276,12 @@
 !
 
 stopMethodForNode:aPPCNode
-    ^ aPPCNode isMarkedForInline ifTrue:[ 
-		compiler dedent.
-		compiler add: '"END inlined code of ' , aPPCNode printString , '"'.
-		compiler stopInline.
+    ^ codeGen currentMethod isInline ifTrue:[ 
+                codeGen dedent.
+                codeGen code: '"END inlined code of ' , aPPCNode printString , '"'.
+                codeGen stopInline.
     ] ifFalse:[ 
-		compiler stopMethod
+                codeGen stopMethod
     ].
 
     "Created: / 23-04-2015 / 15:51:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -337,11 +295,11 @@
 !
 
 cachedDetected: node
-    ^ compiler checkCache: (compiler idFor: node)
+    ^ codeGen clazz cachedMethod: (codeGen idFor: node)
 !
 
 isCached: node
-    ^ (compiler checkCache: (compiler idFor: node)) isNil not
+    ^ (codeGen cachedMethod: (codeGen idFor: node)) isNil not
 ! !
 
 !PPCCodeGenerator methodsFor:'visiting'!
@@ -423,7 +381,7 @@
      So if the method is not inline, make last statement a return.
         if the method is inline, make it assignment to retvalVar."
     blockBody statements notEmpty ifTrue:["Care for empty blocks - [:t | ] !!"
-        compiler currentMethod isInline ifTrue:[ 
+        codeGen currentMethod isInline ifTrue:[ 
             |  assignment |
 
             assignment := RBAssignmentNode variable: (RBVariableNode named: self retvalVar) value:  blockBody statements last.
@@ -436,11 +394,11 @@
         ].
     ].
 
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:self retvalVar.
-    compiler codeIfErrorThen: [ 
-        compiler codeReturn: 'failure'. 
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:self retvalVar.
+    codeGen codeIfErrorThen: [ 
+        codeGen codeReturn: 'failure'. 
     ] else: [
-        compiler code: blockBody.    
+        codeGen code: blockBody.    
     ]
 
     "Modified: / 27-07-2015 / 15:49:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -449,22 +407,22 @@
 visitAndNode: node
     | mementoVar |
     
-    mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
-    compiler smartRemember: node child to: mementoVar.
+    mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+    codeGen remember: node child to: mementoVar.
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
-    compiler smartRestore: node child from: mementoVar.
+    codeGen restore: node child from: mementoVar.
 
-    compiler codeReturn.
+    codeGen codeReturn.
 
     "Modified: / 23-04-2015 / 15:59:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitAnyNode: node
 
-    compiler codeReturn: 'context next ifNil: [ error := true. ].'.
+    codeGen codeReturn: 'context next ifNil: [ error := true. ].'.
 
     "Modified: / 23-04-2015 / 20:52:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -473,17 +431,14 @@
 
     | classification classificationId |
     classification := node extendClassification: node predicate classification.
-    classificationId := compiler idFor: classification defaultName: #classification.
-    compiler addConstant: classification as: classificationId.
+    classificationId := codeGen idFor: classification defaultName: #classification.
+    codeGen addConstant: classification as: classificationId.
     
-    compiler add: '(', classificationId, ' at: context peek asInteger)'.
-    compiler indent.
-    compiler add: 'ifFalse: ['.
-    compiler codeError: 'predicate not found'.
-    compiler add: '] ifTrue: [ '.
-    compiler codeReturn: 'context next'.
-    compiler add: '].'.
-    compiler dedent.
+    codeGen codeIf: '(', classificationId, ' at: context peek asInteger)' then: [ 
+        codeGen codeReturn: 'context next'.
+    ] else: [ 
+        codeGen codeError: 'predicate not found'.
+    ]
 !
 
 visitCharacterNode: node
@@ -491,22 +446,15 @@
     node character ppcPrintable ifTrue: [ 
         chid := node character storeString 
     ] ifFalse: [ 
-        chid := compiler idFor: node character defaultName: #char.
-        compiler addConstant: (Character value: node character asInteger) as: chid .
+        chid := codeGen idFor: node character defaultName: #char.
+        codeGen addConstant: (Character value: node character asInteger) as: chid .
     ].
     
-    compiler add: '(context peek == ', chid, ')'.
-    compiler indent.
-    compiler add: 'ifFalse: ['.
-    compiler indent.
-    compiler codeError: node character asInteger asString, ' expected'.
-    compiler dedent.
-    compiler add: '] ifTrue: [ '.
-    compiler indent.
-    compiler codeReturn: 'context next'.
-    compiler dedent.
-    compiler add: '].'.
-    compiler dedent.
+    codeGen codeIf: '(context peek == ', chid, ')' then: [  
+        codeGen codeReturn: 'context next'.
+    ] else: [ 
+        codeGen codeError: node character asInteger asString, ' expected'.
+    ].
 !
 
 visitChild: child of: node
@@ -523,7 +471,7 @@
 visitChoiceNode: node
     |  whitespaceConsumed useGuards resultVar  |
 
-    resultVar := compiler allocateTemporaryVariableNamed: 'element'.
+    resultVar := codeGen allocateTemporaryVariableNamed: 'element'.
     whitespaceConsumed := self addGuardTrimming: node.
     useGuards := whitespaceConsumed.
     self generateChoiceChildOf: node atIndex: 1 useGuards: useGuards storeResultInto: resultVar
@@ -533,43 +481,41 @@
 !
 
 visitEndOfFileNode: node
-    compiler codeReturn: 'context atEnd ifTrue: [ #EOF ] ifFalse: [ self error: ''EOF expected!!'' ].'.
+    codeGen codeReturn: 'context atEnd ifTrue: [ #EOF ] ifFalse: [ self error: ''EOF expected!!'' ].'.
 !
 
 visitEndOfInputNode: node
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
-    compiler codeIf: 'context atEnd' 
-                then: [ compiler codeReturn ]
-                else: [ compiler codeError: 'End of input expected' ].
+    codeGen codeIf: 'context atEnd' 
+                then: [ codeGen codeReturn ]
+                else: [ codeGen codeError: 'End of input expected' ].
         
     "Modified: / 26-05-2015 / 19:03:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitForwardNode: node
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
-    compiler codeReturn.
+    codeGen codeReturn.
 !
 
 visitLiteralNode: node
     | positionVar encodedLiteral |
     encodedLiteral := node encodeQuotes: node literal.
-    positionVar := compiler allocateTemporaryVariableNamed: 'position'.
+    positionVar := codeGen allocateTemporaryVariableNamed: 'position'.
 
-    compiler codeAssign: 'context position.' to: positionVar.
-    compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['.
-    compiler codeReturn: '#''', encodedLiteral, ''' '.
-    compiler add: '] ifFalse: ['.
-    compiler indent.
-        compiler add: 'context position: ', positionVar, '.'.
-        compiler codeError: encodedLiteral,  ' expected' at: positionVar.
-    compiler dedent.
-    compiler add: '].'.
+    codeGen codeAssign: 'context position.' to: positionVar.
+    codeGen codeIf: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''')' then: [
+        codeGen codeReturn: '#''', encodedLiteral, ''' '.
+    ] else: [  
+        codeGen code: 'context position: ', positionVar, '.'.
+        codeGen codeError: encodedLiteral,  ' expected' at: positionVar.
+    ].
 !
 
 visitMappedActionNode: node
@@ -583,7 +529,7 @@
     "Block return value is return value of last statement.
      So if the method is not inline, make last statement a return.
         if the method is inline, make it assignment to retvalVar."
-    compiler currentMethod isInline ifTrue:[ 
+    codeGen currentMethod isInline ifTrue:[ 
         |  assignment |
 
         assignment := RBAssignmentNode variable: (RBVariableNode named: self retvalVar) value:  blockBody statements last.
@@ -616,22 +562,22 @@
         ]. 
     ].
 
-    compiler codeAssignParsedValueOf: [ self visit: child ] to: self retvalVar.
-    compiler codeIf: 'error' then: [ 
-        compiler codeReturn: 'failure'. 
+    codeGen codeEvaluateAndAssign: [ self visit: child ] to: self retvalVar.
+    codeGen codeIf: 'error' then: [ 
+        codeGen codeReturn: 'failure'. 
     ] else: [
         "If the child is sequence and not inlined, extract
          nodes from returned collection into used-to-be block variables"
         (child isSequenceNode and:[ child returnParsedObjectsAsCollection ]) ifTrue:[
             blockNode arguments withIndexDo:[ :arg :idx |
                 node child isMarkedForInline ifFalse:[ 
-                    compiler allocateTemporaryVariableNamed: arg name.
-                    compiler codeAssign: (self retvalVar , ' at: ', idx printString) to: arg name.
+                    codeGen allocateTemporaryVariableNamed: arg name.
+                    codeGen codeAssign: (self retvalVar , ' at: ', idx printString) to: arg name.
                 ].
-                compiler addOnLine: '.'; nl.
+                codeGen codeOnLine: '.'; codeNl.
             ].
         ].
-        compiler code: blockBody.    
+        codeGen code: blockBody.    
     ]
 
     "Created: / 02-06-2015 / 17:28:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -639,34 +585,30 @@
 !
 
 visitMessagePredicateNode: node
-    compiler add: '(context peek ', node message, ') ifFalse: ['.
-    compiler codeError: 'predicate not found'.
-    compiler add: '] ifTrue: [ '.
-    compiler codeReturn: ' context next'.
-    compiler add: '].'.
-
+    codeGen codeIf: '(context peek ', node message, ')' then: [
+        codeGen codeReturn: ' context next'.
+    ] else: [ 
+        codeGen codeError: 'predicate not found'.
+    ]
     "Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitNilNode: node
 
-    compiler codeReturn: 'nil.'.
+    codeGen codeReturn: 'nil.'.
 !
 
 visitNotCharSetPredicateNode: node
     | classificationId  classification |
     classification := node extendClassification: node predicate classification.
-    classificationId := (compiler idFor: classification defaultName: #classification).
-    compiler  addConstant: classification as: classificationId.
+    classificationId := (codeGen idFor: classification defaultName: #classification).
+    codeGen  addConstant: classification as: classificationId.
     
-    compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'.
-    compiler indent.
-    compiler add: ' ifTrue: ['.
-    compiler codeError: 'predicate not expected'.
-    compiler add: '] ifFalse: ['.
-    compiler codeReturn: 'nil'.
-    compiler add: '].'.
-    compiler dedent.
+    codeGen codeIf: '(', classificationId, ' at: context peek asInteger)'  then: [ 
+        codeGen codeError: 'predicate not expected'.
+    ] else: [ 
+        codeGen codeReturn: 'nil'.
+    ]
 !
 
 visitNotCharacterNode: node
@@ -674,22 +616,15 @@
     node character ppcPrintable ifTrue: [ 
         chid := node character storeString 
     ] ifFalse: [ 
-        chid := compiler idFor: node character defaultName: #char.
-        compiler addConstant: (Character value: node character asInteger) as: chid .
+        chid := codeGen idFor: node character defaultName: #char.
+        codeGen addConstant: (Character value: node character asInteger) as: chid .
     ].
     
-    compiler add: '(context peek == ', chid, ')'.
-    compiler indent.
-    compiler add: 'ifTrue: ['.
-    compiler indent.
-    compiler codeError: node character asInteger asString, ' not expected'.
-    compiler dedent.
-    compiler add: '] ifFalse: [ '.
-    compiler indent.
-    compiler codeReturn: 'nil.'.
-    compiler dedent.
-    compiler add: '].'.
-    compiler dedent.
+    codeGen codeIf: '(context peek == ', chid, ')' then: [ 
+        codeGen codeError: node character asInteger asString, ' not expected'.
+    ] else: [ 
+        codeGen codeReturn: 'nil.'.
+    ].
 !
 
 visitNotLiteralNode: node
@@ -697,113 +632,102 @@
     encodedLiteral := node encodeQuotes: node literal.
     size := node literal size asString.
     
-    compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'.
-    compiler indent.
-    compiler add: 'ifTrue: ['.
-    compiler codeError: encodedLiteral, ' not expected'.
-    compiler add: '] ifFalse: [ '.
-    compiler codeReturn: 'nil' .
-    compiler add: '].'.
-    compiler dedent.
+    codeGen codeIf: '((context peek: ', size, ') =#''', encodedLiteral, ''')' then: [ 
+        codeGen codeError: encodedLiteral, ' not expected'.
+    ] else: [ 
+        codeGen codeReturn: 'nil' .
+    ]
 !
 
 visitNotMessagePredicateNode: node
-    compiler addOnLine: '(context peek ', node message, ')'.
-    compiler indent.
-    compiler add: ' ifTrue: [ '.
-    compiler codeError: 'predicate not expected'.
-    compiler add: '] ifFalse: ['.
-    compiler codeReturn: 'nil'.
-    compiler add: ' ].'.
-    compiler dedent. 
+    codeGen codeIf: '(context peek ', node message, ')' then: [ 
+        codeGen codeError: 'predicate not expected'.
+    ] else: [ 
+        codeGen codeReturn: 'nil'.
+    ]
 !
 
 visitNotNode: node
     | mementoVar |
 
-    mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
-    compiler smartRemember: node child to: mementoVar.
+    mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+    codeGen remember: node child to: mementoVar.
     
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
-    compiler smartRestore: node child from: mementoVar.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+    codeGen restore: node child from: mementoVar.
 
-    compiler add: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
+    codeGen code: '^ error ifFalse: [ self error ] ifTrue: [ self clearError. nil ]'.
 
     "Modified: / 05-05-2015 / 14:29:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitOptionalNode: node
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
-    compiler add: 'error ifTrue: [ '.
-    compiler indent.
-    compiler add: 'self clearError. '.
-    compiler codeAssign: 'nil.' to: self retvalVar.
-    compiler dedent.
-    compiler add: '].'.
-    compiler codeReturn.
+    codeGen codeIf: 'error' then: [ 
+        codeGen codeClearError.
+        codeGen codeAssign: 'nil.' to: self retvalVar.
+    ].
+    codeGen codeReturn.
 !
 
 visitPluggableNode: node
     | blockId |
-    blockId := compiler idFor: node block defaultName: #pluggableBlock.
+    blockId := codeGen idFor: node block defaultName: #pluggableBlock.
     
-    compiler addConstant: node block as: blockId.
-    compiler codeReturn: blockId, ' value: context.'.
+    codeGen addConstant: node block as: blockId.
+    codeGen codeReturn: blockId, ' value: context.'.
 !
 
 visitPlusNode: node
     | elementVar  |
                 
-    elementVar := compiler allocateTemporaryVariableNamed:  'element'.
+    elementVar := codeGen allocateTemporaryVariableNamed:  'element'.
      
 "       self tokenGuards ifTrue: [ 
         compiler codeTokenGuard: node ifFalse: [ compiler codeError: 'at least one occurence expected' ].   
     ].
 "        
-    compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
+    codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
 
-    compiler add: 'error ifTrue: ['.
-    compiler codeError: 'at least one occurence expected'.
-    compiler add: '] ifFalse: ['.
-    compiler indent.
+    codeGen codeIf: 'error' then: [
+        codeGen codeError: 'at least one occurence expected'.
+    ] else: [ 
         (self retvalVar ~~ #whatever) ifTrue:[
-            compiler add: self retvalVar , ' add: ',elementVar , '.'.
+            codeGen code: self retvalVar , ' add: ',elementVar , '.'.
         ].            
-        compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
-        compiler add: '[ error ] whileFalse: ['.
-        compiler indent.
+        codeGen codeEvaluateAndAssignParsedValueOf:[ self visit:node child ] to:elementVar.
+        codeGen code: '[ error ] whileFalse: ['.
+        codeGen indent.
         (self retvalVar ~~ #whatever) ifTrue:[
-            compiler add: self retvalVar , ' add: ',elementVar , '.'.
+            codeGen code: self retvalVar , ' add: ',elementVar , '.'.
         ].
-        compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
-        compiler dedent.
-        compiler add: '].'.
-        compiler add: 'self clearError.'.
+        codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+        codeGen dedent.
+        codeGen code: '].'.
+        codeGen code: 'self clearError.'.
+
         (self retvalVar ~~ #whatever) ifTrue:[ 
-            compiler codeReturn: self retvalVar , ' asArray.'.         
+            codeGen codeReturn: self retvalVar , ' asArray.'.         
         ].
-    compiler dedent.
-    compiler add: '].'.
-
+    ].
     "Modified: / 26-05-2015 / 19:04:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 visitPredicateNode: node
     | pid |
-    pid := (compiler idFor: node predicate defaultName: #predicate).
+    pid := (codeGen idFor: node predicate defaultName: #predicate).
 
-    compiler addConstant: node predicate as: pid.
+    codeGen addConstant: node predicate as: pid.
 
-    compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'.
-    compiler indent.
-    compiler add: 'ifFalse: ['.
-    compiler codeError: 'predicate not found'.
-    compiler add: '] ifTrue: [ ', self retvalVar ,' := context next ].'.
-    compiler dedent.   
-    compiler codeReturn.
+    codeGen codeIf: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])' then: [ 
+        codeGen code: self retvalVar ,' := context next.'.
+    ] else: [ 
+        codeGen codeError: 'predicate not found'.
+    ].
+    codeGen codeReturn.
 
     "Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -814,26 +738,24 @@
     canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
 
     canBacktrack ifTrue: [ 
-        mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.			
-        compiler smartRemember: node to: mementoVar.
+        mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.			
+        codeGen remember: node to: mementoVar.
     ].
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:(node children at:1) ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:(node children at:1) ]
           to:#whatever.
-    compiler add: 'error ifTrue: [ ^ failure ].'.
+    codeGen code: 'error ifTrue: [ ^ failure ].'.
 
     2 to: (node children size) do: [ :idx  | |child|
         child := node children at: idx.
-        compiler codeAssignParsedValueOf:[ self visit:child ] to:#whatever.
+        codeGen codeEvaluateAndAssignParsedValueOf:[ self visit:child ] to:#whatever.
         
         child acceptsEpsilon ifFalse: [   
-            compiler add: 'error ifTrue: [ '.
-            compiler indent.
-            compiler smartRestore: node from: mementoVar.
-            compiler add: ' ^ failure .'.
-            compiler dedent.
-            compiler add: '].'.
+            codeGen codeIf: 'error' then: [ 
+                codeGen restore: node from: mementoVar.
+                codeGen code: ' ^ failure .'.
+            ]
         ].
     ].
 !
@@ -844,7 +766,7 @@
 
     elementVars := node preferredChildrenVariableNames.
     elementVars do:[:e | 
-        compiler allocateTemporaryVariableNamed: e.  
+        codeGen allocateTemporaryVariableNamed: e.  
     ].
 
     canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not.
@@ -853,15 +775,15 @@
     self addGuard: node ifTrue: nil ifFalse: [ compiler addOnLine: ' ^ self error' ].
 "
     canBacktrack ifTrue: [ 
-        mementoVar := compiler allocateTemporaryVariableNamed: 'memento'.
-        compiler smartRemember: node to: mementoVar.
+        mementoVar := codeGen allocateTemporaryVariableNamed: 'memento'.
+        codeGen remember: node to: mementoVar.
     ].
 
     node returnParsedObjectsAsCollection ifTrue:[
-        compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
+        codeGen codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar.
     ].
     self generateSequenceChildOf: node atIndex: 1 useMememntoVar: mementoVar storeResultInto: elementVars.
-    compiler codeReturn
+    codeGen codeReturn
 
     "Modified (comment): / 16-06-2015 / 06:38:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -870,11 +792,11 @@
     | retvalVar sizeVar |
 
     retvalVar := self retvalVar.
-    sizeVar := compiler allocateTemporaryVariableNamed: 'size'.  
-    compiler add: sizeVar , ' := context size - context position.'.
-    compiler add: retvalVar,' := Array new: ',sizeVar,'.'.
-    compiler add: '(1 to: ',sizeVar,') do: [ :e | ',retvalVar,' at: e put: context next ].'.
-    compiler codeReturn.
+    sizeVar := codeGen allocateTemporaryVariableNamed: 'size'.  
+    codeGen code: sizeVar , ' := context size - context position.'.
+    codeGen code: retvalVar,' := Array new: ',sizeVar,'.'.
+    codeGen code: '(1 to: ',sizeVar,') do: [ :e | ',retvalVar,' at: e put: context next ].'.
+    codeGen codeReturn.
 
     "Modified: / 15-06-2015 / 18:53:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
@@ -884,67 +806,63 @@
     
 
     classification := node extendClassification: node predicate classification.
-    classificationId := compiler idFor: classification defaultName: #classification.
-    compiler addConstant: classification as: classificationId.
+    classificationId := codeGen idFor: classification defaultName: #classification.
+    codeGen addConstant: classification as: classificationId.
     
-    compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
-    compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
-    compiler indent.
-    compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
-    compiler dedent.
-    compiler add: '].'.
-    compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
-   compiler codeReturn.
+    codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.	
+    codeGen code: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['.
+    codeGen indent.
+    codeGen codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
+    codeGen dedent.
+    codeGen code: '].'.
+    codeGen codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
+   codeGen codeReturn.
 !
 
 visitStarMessagePredicateNode: node
 
-    compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.	
-    compiler add: '[ context peek ', node message, ' ] whileTrue: ['.
-    compiler indent.
-    compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
-    compiler dedent.
-    compiler add: '].'.
-    compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
-   compiler codeReturn.
+    codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.	
+    codeGen code: '[ context peek ', node message, ' ] whileTrue: ['.
+    codeGen indent.
+    codeGen codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar.
+    codeGen dedent.
+    codeGen code: '].'.
+    codeGen codeAssign: self retvalVar, ' asArray.' to: self retvalVar.
+   codeGen codeReturn.
 !
 
 visitStarNode: node
     | elementVar |
     
-    elementVar := compiler allocateTemporaryVariableNamed: 'element'.
+    elementVar := codeGen allocateTemporaryVariableNamed: 'element'.
+    codeGen codeAssign: 'OrderedCollection new.' to: self retvalVar.
 
-    self addGuard: node child ifTrue: nil ifFalse: [ compiler codeReturn: '#()' ].
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+    codeGen codeIf: 'error' then: [ 
+        codeGen codeClearError.
+        codeGen codeReturn: self retvalVar, ' asArray.'.
+    ].
 
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
-    compiler codeIf: 'error' 
-        then: [ 
-            compiler codeClearError.
-            compiler codeReturn: '#()'.
-        ] else: [
-            compiler codeAssign: 'OrderedCollection new.' to: self retvalVar.
-        ].
-
-    compiler add: '[ error ] whileFalse: ['.
-    compiler indent.
-    compiler add: self retvalVar, ' add: ', elementVar, '.'.
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
-    compiler dedent.
-    compiler add: '].'.
-    compiler codeClearError.
-    compiler codeReturn: self retvalVar, ' asArray.'.
+    codeGen code: '[ error ] whileFalse: ['.
+    codeGen indent.
+    codeGen code: self retvalVar, ' add: ', elementVar, '.'.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+    codeGen dedent.
+    codeGen code: '].'.
+    codeGen codeClearError.
+    codeGen codeReturn: self retvalVar, ' asArray.'.
 !
 
 visitSymbolActionNode: node
     | elementVar |
     
-    elementVar := compiler allocateTemporaryVariableNamed: 'element'.	
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:elementVar.
-    compiler add: 'error ifFalse: [ '.
-    compiler codeReturn: elementVar, ' ', node block asString, '.'.
-    compiler add: '] ifTrue: ['.
-    compiler codeReturn: 'failure'.
-    compiler add: ']'.
+    elementVar := codeGen allocateTemporaryVariableNamed: 'element'.	
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:elementVar.
+    codeGen codeIf: 'error' then: [ 
+        codeGen codeReturn: 'failure'
+    ] else: [
+        codeGen codeReturn: elementVar, ' ', node block asString, '.'.
+    ]
 !
 
 visitTokenActionNode: node
@@ -954,75 +872,68 @@
         the input value.
     "	
 
-    compiler add: '^ '.
-    compiler callOnLine: (node child compileWith: compiler).
+    codeGen add: '^ '.
+    codeGen callOnLine: (node child compileWith: codeGen).
 !
 
 visitTokenNode: node
     | startVar endVar |
-    startVar := compiler allocateTemporaryVariableNamed: 'start'.
-    endVar := compiler allocateTemporaryVariableNamed: 'end'.
+    startVar := codeGen allocateTemporaryVariableNamed: 'start'.
+    endVar := codeGen allocateTemporaryVariableNamed: 'end'.
     
-    compiler profileTokenRead: (compiler idFor: node).
+    codeGen profileTokenRead: (codeGen idFor: node).
     
-    compiler codeAssign: 'context position + 1.' to: startVar.
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
-    compiler add: 'error ifFalse: [ '.
-    compiler indent.	
-    compiler codeAssign: 'context position.' to: endVar.
-    
-    compiler codeReturn: node tokenClass asString, ' on: (context collection) 
-                                                                start: ', startVar, '  
-                                                                stop: ', endVar, '
-                                                                value: nil.'.
-    compiler dedent.
-    compiler add: '].'.
+    codeGen codeAssign: 'context position + 1.' to: startVar.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+    codeGen codeIf: 'error' then: nil else: [
+        codeGen codeAssign: 'context position.' to: endVar.
+        codeGen codeReturn: node tokenClass asString, ' on: (context collection) 
+                                                                    start: ', startVar, '  
+                                                                    stop: ', endVar, '
+                                                                    value: nil.'.
+    ]
 !
 
 visitTokenStarMessagePredicateNode: node
 
-    compiler add: '[ context peek ', node message,' ] whileTrue: ['.
-    compiler indent.
-    compiler add: 'context next'.
-    compiler indent.
-    compiler dedent.
-    compiler add: '].'.
+    codeGen code: '[ context peek ', node message,' ] whileTrue: ['.
+    codeGen indent.
+    codeGen code: 'context next'.
+    codeGen indent.
+    codeGen dedent.
+    codeGen code: '].'.
 !
 
 visitTokenStarSeparatorNode: node
 
-    compiler add: 'context skipSeparators.'.
+    codeGen code: 'context skipSeparators.'.
 !
 
 visitTokenWhitespaceNode: node
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
-    compiler codeReturn.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
+    codeGen codeReturn.
 !
 
 visitTrimNode: node
     | mementoVar |
     "TODO: This ignores the TrimmingParser trimmer object!!"
 
-    mementoVar := compiler allocateTemporaryVariableNamed:  'memento'.
+    mementoVar := codeGen allocateTemporaryVariableNamed:  'memento'.
 
-    compiler smartRemember: node child to: mementoVar.
-    compiler add: 'context skipSeparators.'.
+    codeGen remember: node child to: mementoVar.
+    codeGen code: 'context skipSeparators.'.
 
-    compiler 
-          codeAssignParsedValueOf:[ self visit:node child ]
+    codeGen 
+          codeEvaluateAndAssign:[ self visit:node child ]
           to:self retvalVar.
     
-    compiler add: 'error ifTrue: [ '.
-    compiler indent.
-        compiler smartRestore: node child from: mementoVar.
-        compiler codeReturn.
-    compiler dedent.
-    compiler add: '] ifFalse: ['	.
-        compiler indent.
-        compiler add: 'context skipSeparators.'.
-        compiler codeReturn.
-        compiler dedent.
-    compiler add: '].'.
+    codeGen codeIf: 'error' then: [ 
+        codeGen restore: node child from: mementoVar.
+        codeGen codeReturn.
+    ] else: [ 
+        codeGen code: 'context skipSeparators.'.
+        codeGen codeReturn.
+    ]
 !
 
 visitTrimmingTokenCharacterNode: node
@@ -1032,50 +943,47 @@
 visitTrimmingTokenNode: node
     |  id guard startVar endVar |
 
-    startVar := compiler allocateTemporaryVariableNamed: 'start'.
-    endVar := compiler allocateTemporaryVariableNamed:  'end'.
+    startVar := codeGen allocateTemporaryVariableNamed: 'start'.
+    endVar := codeGen allocateTemporaryVariableNamed:  'end'.
     
-    id := compiler idFor: node.
-    compiler profileTokenRead: id.
+    id := codeGen idFor: node.
+    codeGen profileTokenRead: id.
     
     self compileTokenWhitespace: node.
 
     (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ 
         guard id: id, '_guard'.
-        compiler add: 'context atEnd ifTrue: [ self error ].'.
-        guard compileGuard: compiler.
-        compiler addOnLine: 'ifFalse: [ self error ].'.
-        compiler add: 'error ifFalse: ['.
-        compiler indent.
+        codeGen code: 'context atEnd ifTrue: [ self error ].'.
+        guard compileGuard: codeGen.
+        codeGen codeOnLine: 'ifFalse: [ self error ].'.
+        codeGen code: 'error ifFalse: ['.
+        codeGen indent.
     ].
 
-    compiler codeAssign: 'context position + 1.' to: startVar.
-    compiler codeAssignParsedValueOf:[ self visit:node child ] to:#whatever.
+    codeGen codeAssign: 'context position + 1.' to: startVar.
+    codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever.
 
     (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ 
-        compiler dedent.
-        compiler add: '].'.
+        codeGen dedent.
+        codeGen code: '].'.
     ].
 
-    compiler add: 'error ifFalse: [ '.
-    compiler indent.	
-    compiler codeAssign: 'context position.' to: endVar.
-    
-"	self compileSecondWhitespace: compiler."
-    self compileTokenWhitespace: node.
+    codeGen codeIf: 'error' then: nil else: [
+        codeGen codeAssign: 'context position.' to: endVar.
+        "	self compileSecondWhitespace: compiler."
+        self compileTokenWhitespace: node.
 
-    compiler codeReturn: node tokenClass asString, ' on: (context collection) 
-                                                                start: ', startVar, ' 
-                                                                stop: ', endVar, '
-                                                                value: nil'.
-    compiler dedent.																
-    compiler add: '].'
+        codeGen codeReturn: node tokenClass asString, ' on: (context collection) 
+                                                                    start: ', startVar, ' 
+                                                                    stop: ', endVar, '
+                                                                    value: nil'.
+    ]
 !
 
 visitUnknownNode: node
     | compiledChild compiledParser id |
 
-    id := compiler idFor: node.
+    id := codeGen idFor: node.
     
     compiledParser := node parser copy.
     "Compile all the children and call compiled version of them instead of the original one"
@@ -1084,15 +992,14 @@
         compiledParser replace: child with: compiledChild bridge.
     ].
     
-    compiler addConstant: compiledParser as: id. 
+    codeGen addConstant: compiledParser as: id. 
     
-    compiler codeClearError.
-    compiler add: '(', self retvalVar, ' := ', id, ' parseOn: context) isPetitFailure'.
-    compiler indent.
-    compiler add: ' ifTrue: [self error: ', self retvalVar, ' message at: ', self retvalVar, ' position ].'.
-    compiler dedent.
-    compiler add: 'error := ', self retvalVar, ' isPetitFailure.'.
-    compiler codeReturn.
+    codeGen codeClearError.
+    codeGen codeIf: '(', self retvalVar, ' := ', id, ' parseOn: context) isPetitFailure' then: [ 
+        codeGen codeError: 'self error: ', self retvalVar at: self retvalVar, ' position .'.
+    ].
+    codeGen code: 'error := ', self retvalVar, ' isPetitFailure.'.
+    codeGen codeReturn.
 
     "Modified: / 15-06-2015 / 17:59:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !