compiler/PPCTokenVisitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Mar 2016 00:12:47 +0100
changeset 556 51c6afba5c91
parent 515 b5316ef15274
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 }"

PPCRewritingVisitor subclass:#PPCTokenVisitor
	instanceVariableNames:'forbiddenNodes'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCTokenVisitor methodsFor:'as yet unclassified'!

visitActionNode: node	

    (node hasProperty: #trimmingToken) ifTrue: [ 
        | child newChild | 
        "trimming token in token, remove it"
        self change.
        
        child := node child secondChild.
        newChild := self visit: child.
        
        child name isNil ifTrue: [ 
            newChild name: node name.
            ^ newChild.
        ].
        ^ PPCForwardNode new
            child: newChild;
            name: node name;
            yourself
    ].

    ^ super visitActionNode: node
!

visitTokenNode: node
    "token in token, remove the token"
    self visitChildren: node.
    
    node child name isNil ifTrue: [ 
        self change.
        node child name: node name.
        ^ node child
    ].

 	self change.
    ^ PPCForwardNode new
        child: node child;
        name: node name;
        yourself	
! !

!PPCTokenVisitor methodsFor:'traversing'!

afterAccept: node retval: retval

    (retval name isNil not and: [ (retval name endsWith: '_ws') ]) ifTrue: [ 
        self change.
        ^ PPCTokenWhitespaceNode new
            child: retval;
            yourself
    ].
    ^ super afterAccept: node retval: retval
!

beforeAccept: node
    self assert: (forbiddenNodes includes: node) not description: 'Does not look like a token' 
!

forbiddenNodes: nodeSet
    forbiddenNodes := nodeSet.
! !