Merged in PetitCompiler-JanVrany.170, PetitCompiler-Tests-JanKurs.116, PetitCompiler-Extras-Tests-JanKurs.29, PetitCompiler-Benchmarks-JanKurs.19
Name: PetitCompiler-JanVrany.170
Author: JanVrany
Time: 24-08-2015, 03:19:51.340 PM
UUID: c20a744f-3b41-4aaa-bb8a-71ce74a2a952
Name: PetitCompiler-Tests-JanKurs.116
Author: JanKurs
Time: 24-08-2015, 11:37:54.332 AM
UUID: 549e0927-358a-4a1b-8270-050ccfcb4217
Name: PetitCompiler-Extras-Tests-JanKurs.29
Author: JanKurs
Time: 24-08-2015, 11:36:52.503 AM
UUID: ea1dbb67-f884-4237-8f34-adb0677c0954
Name: PetitCompiler-Benchmarks-JanKurs.19
Author: JanKurs
Time: 24-08-2015, 11:48:47.045 AM
UUID: 1c342fdb-8ddd-4104-9c47-a8f589c51694
"{ 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
! !