--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/PPCUniversalCodeGenerator.st Mon Aug 24 15:34:14 2015 +0100
@@ -0,0 +1,80 @@
+"{ Package: 'stx:goodies/petitparser/compiler' }"
+
+"{ NameSpace: Smalltalk }"
+
+PPCCodeGenerator subclass:#PPCUniversalCodeGenerator
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'PetitCompiler-Visitors-CodeGenerators'
+!
+
+!PPCUniversalCodeGenerator methodsFor:'guards'!
+
+addGuard: node ifTrue: trueBlock ifFalse: falseBlock
+ | guard id |
+ (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
+ id := codeGen idFor: node.
+
+" falseBlock isNil ifFalse: [
+ compiler add: 'context atEnd'.
+ compiler addOnLine: ' ifTrue: ['.
+ compiler indent.
+ falseBlock value.
+ compiler dedent.
+ compiler addOnLine: '].'.
+ ]."
+
+ guard id: (codeGen idFor: guard defaultName: #guard).
+ guard compileGuard: codeGen.
+
+ trueBlock isNil ifFalse: [
+ codeGen codeOnLine: ' ifTrue: ['.
+ codeGen indent.
+ trueBlock value.
+ codeGen dedent.
+ falseBlock isNil ifTrue: [ codeGen codeOnLine: '].' ]
+ ifFalse: [ codeGen code: ']'. ]
+ ].
+ falseBlock isNil ifFalse: [
+ codeGen codeOnLine: ' ifFalse: ['.
+ codeGen indent.
+ falseBlock value.
+ codeGen dedent.
+ codeGen codeOnLine: '].'.
+ ].
+ ^ true
+!
+
+addGuardTrimming: node
+ | guard firsts id |
+ (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false].
+
+ id := codeGen 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
+! !
+
+!PPCUniversalCodeGenerator methodsFor:'initialization'!
+
+initialize
+ super initialize.
+
+ codeGen := PPCUniversalCodeGen new
+! !
+
+!PPCUniversalCodeGenerator methodsFor:'visiting'!
+
+visitStarNode: node
+ self addGuard: node child ifTrue: nil ifFalse: [ codeGen codeReturn: '#()' ].
+
+ super visitStarNode: node
+! !
+