PluggableParseNodeVisitor.st
author Claus Gittinger <cg@exept.de>
Sun, 17 Jun 2018 08:31:51 +0200
changeset 4278 d756ed6a7120
parent 3794 ea706f2a101f
child 3841 a22f33410bdf
child 4543 b2f5c92b579b
permissions -rw-r--r--
#FEATURE by cg class: ConstantNode added: #isConstantNumber
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3782
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libcomp' }"
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
ParseNodeVisitor subclass:#PluggableParseNodeVisitor
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'actionsPerNodeType'
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	category:'System-Compiler-Support'
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!PluggableParseNodeVisitor class methodsFor:'documentation'!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
documentation
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
"
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    a pluggable node visitor.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    setup with:
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
        actionForNodeClass:aClass put:aBlock
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
        
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    for example, if you are only interested in assignments,
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    use the following code:
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
        |v|
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
        v := PluggableParseNodeVisitor new.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
        v actionForNodeClass:AssignmentNode put:[:node | Transcript showCR:node. true].
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
        v visit:(Parser parse:code in:someClass.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
! !
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
!PluggableParseNodeVisitor methodsFor:'setup'!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
actionForNodeClass:aNodeClass put:aBlock
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
    "setup so that for nodes of type aNodeClass, aBlock is invoked.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
     If the block returns true, subnodes (eg. right side of assignments, etc.)
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
     will be enumerated as well.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
     Otherwise, no subnodes are visited."
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    actionsPerNodeType isNil ifTrue:[
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
         actionsPerNodeType := Dictionary new.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    ].
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    actionsPerNodeType at:aNodeClass put:aBlock
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
! !
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
!PluggableParseNodeVisitor methodsFor:'visiting'!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
visit:aNodeObject
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    "redefined to look for an action for this node's class.
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
     If there is one, it can specify if subnodes are to be visited too"
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
     
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    |action|
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
3794
ea706f2a101f #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 3782
diff changeset
    51
    action := actionsPerNodeType at:aNodeObject class ifAbsent:[nil].
3782
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    action notNil ifTrue:[ 
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
        (action value:aNodeObject) ifFalse:[^ self].
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    ].
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    super visit:aNodeObject
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
! !
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!PluggableParseNodeVisitor class methodsFor:'documentation'!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
version
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    ^ '$Header$'
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
!
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
version_CVS
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    ^ '$Header$'
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
! !
226f62e32424 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67