compiler/PPCTokenizingVisitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Aug 2015 12:13:16 +0100
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
child 516 3b81c9e53352
child 524 f6f68d32de73
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.160, PetitCompiler-Tests-JanKurs.112, PetitCompiler-Extras-Tests-JanKurs.25, PetitCompiler-Benchmarks-JanKurs.17 Name: PetitCompiler-JanKurs.160 Author: JanKurs Time: 17-08-2015, 09:52:26.291 AM UUID: 3b4bfc98-8098-4951-af83-a59e2585b121 Name: PetitCompiler-Tests-JanKurs.112 Author: JanKurs Time: 16-08-2015, 05:00:32.936 PM UUID: 85613d47-08f3-406f-9823-9cdab451e805 Name: PetitCompiler-Extras-Tests-JanKurs.25 Author: JanKurs Time: 16-08-2015, 05:00:10.328 PM UUID: 09731810-51a1-4151-8d3a-56b636fbd1f7 Name: PetitCompiler-Benchmarks-JanKurs.17 Author: JanKurs Time: 05-08-2015, 05:29:32.407 PM UUID: e544b5f1-bcf8-470b-93a6-d2363e4dfc8a

"{ Package: 'stx:goodies/petitparser/compiler' }"

"{ NameSpace: Smalltalk }"

PPCRewritingVisitor subclass:#PPCTokenizingVisitor
	instanceVariableNames:'tokens'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCTokenizingVisitor methodsFor:'hooks'!

afterAccept: node retval: parserNode
    self isRoot ifTrue: [ 
        | tokensNode whitespaceNode |
        self change.
"		tokens addLast: self eofToken."
        tokens do: [ :token | token unmarkForInline ].
        whitespaceNode := tokens detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ].
        whitespaceNode notNil ifTrue: [ 
                whitespaceNode := whitespaceNode whitespace copy
                    unmarkForInline;
                    name: 'consumeWhitespace';
                    yourself.
                "whitespaceNode := PPCTokenWhitespaceNode new
                    child: whitespaceNode;
                    yourself"
        ] ifFalse: [ 
                whitespaceNode := PPCNilNode new
                    name: 'consumeWhitespace';
                    yourself 
        ].
        
        tokensNode := PPCListNode new
            children: tokens asArray;
            name: 'nextToken';
            yourself.
            
        ^ PPCTokenizingParserNode new
            parser: parserNode;
            whitespace: whitespaceNode;
            tokens: tokensNode;
            name: #mainParser;
            yourself ].
    ^ parserNode
    
    "Modified: / 12-05-2015 / 01:37:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

eofToken
    | ws  |
    self error: 'deprecated?'.
    ws := PPCStarNode new
        child: (PPCMessagePredicateNode new
            message: #isSeparator;
            yourself);
        yourself.
    
    ^ PPCTrimmingTokenNode new
        child: PPCEndOfFileNode new;
        whitespace: ws;
        tokenClass: PPToken;
        name: 'eof'
        yourself.
! !

!PPCTokenizingVisitor methodsFor:'initialization'!

initialize
    super initialize.
    tokens := OrderedCollection new.
! !

!PPCTokenizingVisitor methodsFor:'testing'!

isRoot
    ^ openSet size = 1
! !

!PPCTokenizingVisitor methodsFor:'tokens'!

addToken: token
    (tokens contains: [:e | e == token] ) ifFalse: [ 
        tokens addLast: token
    ]
! !

!PPCTokenizingVisitor methodsFor:'visiting'!

visitActionNode: node
    (node hasProperty: #trimmingToken) ifTrue: [ 
        self halt: 'can this happen?'.
        self change.
        self addToken: node.
        
        ^ PPCTokenConsumeNode new
            child: node;
            yourself	
    ].

    ^ super visitActionNode: node
!

visitTokenConsumeNode: node
    "
        Seems, it might happen, that if I create the consume node, 
        I will ge to it later. This would create a token consume node for the
        child, thus having tokenConsumNode with tokenConsumNode as a child...
    "
    ^ node
!

visitTokenNode: node
    self change.
    self addToken: node.
    
    self assert: node acceptsEpsilon not description: 'Sorry, but the epsilon tokens are not allowed'.
    
    ^ PPCTokenConsumeNode new
        child: node;
        yourself.
!

visitTrimmingTokenNode: node
    self change.
    self addToken: node.
    
    ^ PPCTokenConsumeNode new
        child: node;
        name: node name;
        yourself.
! !