PluggableParseNodeVisitor.st
author Claus Gittinger <cg@exept.de>
Fri, 08 Feb 2019 22:00:01 +0100
changeset 4335 d58aa3c7751c
parent 3794 ea706f2a101f
child 3841 a22f33410bdf
child 4543 b2f5c92b579b
permissions -rw-r--r--
#FEATURE by cg class: ParserFlags comment/format in: #initialize class: ParserFlags class added: #allowCaretAsBinop #allowCaretAsBinop: comment/format in: #allowCStrings:

"{ Package: 'stx:libcomp' }"

"{ NameSpace: Smalltalk }"

ParseNodeVisitor subclass:#PluggableParseNodeVisitor
	instanceVariableNames:'actionsPerNodeType'
	classVariableNames:''
	poolDictionaries:''
	category:'System-Compiler-Support'
!

!PluggableParseNodeVisitor class methodsFor:'documentation'!

documentation
"
    a pluggable node visitor.
    setup with:
        actionForNodeClass:aClass put:aBlock
        
    for example, if you are only interested in assignments,
    use the following code:
        |v|
        v := PluggableParseNodeVisitor new.
        v actionForNodeClass:AssignmentNode put:[:node | Transcript showCR:node. true].
        v visit:(Parser parse:code in:someClass.
"
! !

!PluggableParseNodeVisitor methodsFor:'setup'!

actionForNodeClass:aNodeClass put:aBlock
    "setup so that for nodes of type aNodeClass, aBlock is invoked.
     If the block returns true, subnodes (eg. right side of assignments, etc.)
     will be enumerated as well.
     Otherwise, no subnodes are visited."

    actionsPerNodeType isNil ifTrue:[
         actionsPerNodeType := Dictionary new.
    ].
    actionsPerNodeType at:aNodeClass put:aBlock
! !

!PluggableParseNodeVisitor methodsFor:'visiting'!

visit:aNodeObject
    "redefined to look for an action for this node's class.
     If there is one, it can specify if subnodes are to be visited too"
     
    |action|

    action := actionsPerNodeType at:aNodeObject class ifAbsent:[nil].
    action notNil ifTrue:[ 
        (action value:aNodeObject) ifFalse:[^ self].
    ].
    super visit:aNodeObject
! !

!PluggableParseNodeVisitor class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !