compiler/PPCNodeVisitor.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Aug 2015 12:13:16 +0100
changeset 515 b5316ef15274
parent 502 1e45d3c96ec5
child 529 439c4057517f
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 }"

Object subclass:#PPCNodeVisitor
	instanceVariableNames:'openSet closeSet cache arguments'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Visitors'
!

!PPCNodeVisitor class methodsFor:'instance creation'!

new
    ^ self basicNew initialize
! !

!PPCNodeVisitor methodsFor:'accessing'!

arguments: args
    arguments := args
! !

!PPCNodeVisitor methodsFor:'hooks'!

afterAccept: node retval: retval
    "nothing to do"
    ^ retval
!

beforeAccept: node
    "nothing to do"
!

closedDetected: node
    ^ #closed
!

openDetected: node
    ^ #open
! !

!PPCNodeVisitor methodsFor:'initialization'!

initialize
    super initialize.
    openSet := IdentitySet new.
    closeSet := IdentitySet new.	
    cache := IdentityDictionary new.
! !

!PPCNodeVisitor methodsFor:'traversing'!

close: node
    self assert: (self isOpen: node) description: 'should be opened first!!'.
    openSet size > 500 ifTrue: [ self error: 'This seems to be a bit too much, isnt it?' ].
        
    openSet remove: node.
    closeSet add: node
!

isClosed: child
    ^ closeSet includes: child
!

isOpen: child
    ^ openSet includes: child
!

open: node
    self assert: (self isOpen: node) not description: 'already opened!!'.
    openSet size > 100 ifTrue: [ self error: 'This seems to be a bit too much, isnt it?' ].
    openSet add: node
!

visit: node
    | retval |
    (self isOpen: node) ifTrue: [ 
        ^ self openDetected: node
    ].

    (self isCached: node) ifTrue: [ 
        ^ self cachedDetected: node.
    ].

    (self isClosed: node) ifTrue: [ 
        self closedDetected: node
    ].

    self open: node.
    self beforeAccept: node.
    retval := node accept: self.
    retval := self afterAccept: node retval: retval.
    self close: node.
    self cache: node value: retval.	
    
    ^ retval
!

visitChildren: node
    node children do: [ :child | 
        self visit: child
    ]
! !

!PPCNodeVisitor methodsFor:'traversing - caching'!

cache: node value: retval
    self assert: (cache includesKey: node) not.
    cache at: node put: retval
!

cachedDetected: node
    ^ self cachedValue: node
!

cachedValue: node
    ^ cache at: node
!

isCached: node
    ^ cache includesKey: node
! !

!PPCNodeVisitor methodsFor:'visiting'!

visitActionNode: node
    ^ self visitNode: node
!

visitAndNode: node
    ^ self visitNode: node
!

visitAnyNode: node
    ^ self visitNode: node
!

visitCharSetPredicateNode: node
    ^ self visitNode: node
!

visitCharacterNode: node
    ^ self visitNode: node
!

visitChoiceNode: node
    ^ self visitNode: node
!

visitDeterministicChoiceNode: node
    ^ self visitNode: node
!

visitEndOfFileNode: node
    ^ self visitNode: node
!

visitEndOfInputNode: node
    ^ self visitNode: node
!

visitForwardNode: node
    ^ self visitNode: node
!

visitLiteralNode: node
    "default implementation"
    ^ self visitNode: node.
!

visitMappedActionNode: node
    ^ self visitActionNode: node

    "Created: / 02-06-2015 / 17:28:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitMessagePredicateNode: node
    ^ self visitNode: node
!

visitNilNode: node
    ^ self visitNode: node
!

visitNode: node
    self visitChildren: node.
    ^ node
!

visitNotCharSetPredicateNode: node
    ^ self visitNode: node
!

visitNotCharacterNode: node
    ^ self visitNode: node
!

visitNotLiteralNode: node
    ^ self visitNode: node
!

visitNotMessagePredicateNode: node
    ^ self visitNode: node
!

visitNotNode: node
    ^ self visitNode: node
!

visitOptionalNode: node
    ^ self visitNode: node
!

visitPluggableNode: node
    ^ self visitNode: node
!

visitPlusNode: node
    ^ self visitNode: node
!

visitPredicateNode: node
    ^ self visitNode: node
!

visitRecognizingSequenceNode: node
    ^ self visitNode: node
!

visitSequenceNode: node
    ^ self visitNode: node
!

visitStarAnyNode: node
    ^ self visitNode: node
!

visitStarCharSetPredicateNode: node
    ^ self visitNode: node
!

visitStarMessagePredicateNode: node
    ^ self visitNode: node
!

visitStarNode: node
    ^ self visitNode: node
!

visitSymbolActionNode: node
    ^ self visitNode: node
!

visitTokenActionNode: node
    ^ self visitNode: node
!

visitTokenChoiceNode: node
    ^ self visitNode: node
!

visitTokenConsumeNode: node
    ^ self visitNode: node
!

visitTokenNode: node
    ^ self visitNode: node
!

visitTokenStarMessagePredicateNode: node
    ^ self visitNode: node
!

visitTokenStarSeparatorNode: node
    ^ self visitNode: node
!

visitTokenWhitespaceNode: node
    ^ self visitNode: node
!

visitTokenizingParserNode: node
    ^ self visitNode: node
!

visitTrimNode: node
    ^ self visitNode: node
!

visitTrimmingTokenCharacterNode: node
    ^ self visitNode: node
!

visitTrimmingTokenNode: node
    ^ self visitNode: node
!

visitUnknownNode: node
    ^ self visitNode: node
! !