compiler/PPCTokenizingVisitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 10 May 2015 06:28:36 +0100
changeset 452 9f4558b3be66
child 454 a9cd5ea7cc36
child 459 4751c407bb40
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.111, PetitCompiler-Tests-JanKurs.51, PetitCompiler-Benchmarks-JanKurs.7, added PetitCompiler-Extras-Tests-JanKurs.4 Name: PetitCompiler-JanKurs.111 Author: JanKurs Time: 08-05-2015, 05:56:05.327 PM UUID: 8805e696-9933-49b8-a5c8-a963b931b996 Name: PetitCompiler-Tests-JanKurs.51 Author: JanKurs Time: 08-05-2015, 05:17:44.224 PM UUID: 21c24114-73be-4ba2-86cd-5a4402f778a0 Name: PetitCompiler-Benchmarks-JanKurs.7 Author: JanKurs Time: 07-05-2015, 06:06:12.918 PM UUID: 0e6e2c0a-90f6-4f46-9663-c66f636da602 Name: PetitCompiler-Extras-Tests-JanKurs.4 Author: JanKurs Time: 08-05-2015, 05:56:46.180 PM UUID: 4d4d4d23-c5bc-41ef-ad41-8a56528ddb42

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

"{ NameSpace: Smalltalk }"

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

!PPCTokenizingVisitor methodsFor:'hooks'!

afterAccept: node retval: retval
    Halt if: [ node name = 'start' ].
    self isRoot ifTrue: [ 
        | tokenizerNode |
        self change.
        tokens addLast: self eofToken.
        tokens do: [ :token | token unmarkForInline  ].
        
        tokenizerNode := PPCTokenChoiceNode new
            children: tokens asArray;
            name: 'nextToken';
            yourself.
    
        ^ PPCTokenizingParserNode new
            parser: retval;
            tokenizer: tokenizerNode;
            name: #'mainParser';
            yourself
    ].
    ^ retval
    
!

eofToken
    | ws  |
    ws := PPCStarNode new
        child: (PPCMessagePredicateNode new
            message: #isSeparator;
            yourself);
        yourself.
    
    ^ PPCTrimmingTokenNode new
        child: PPCEndOfFileNode new;
        whitespace: ws;
        tokenClass: PPToken;
        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 change.
        self addToken: node.
        
        ^ PPCTokenConsumeNode new
            child: node;
            yourself	
    ].

    ^ super visitActionNode: node
!

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

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