compiler/PPCUniversalCodeGenerator.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Mar 2016 00:12:47 +0100
changeset 556 51c6afba5c91
parent 524 f6f68d32de73
permissions -rw-r--r--
CI: Use VM provided by Pharo team on both Linux and Windows. Hand-crafter Pharo VM is no longer needed as the Linux slave in SWING build farm has been upgraded so it has compatible GLIBC. This makes CI scripts simpler and more usable for other people.

"{ 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
! !