SmaCC__SmaCCRHS.st
author vranyj1
Wed, 17 Nov 2010 21:57:55 +0000
changeset 20 4ea23addc2c4
parent 15 8b8cd1701c33
child 23 11ad79f459e6
permissions -rw-r--r--
Makefile updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     1
"{ Package: 'stx:goodies/smaCC' }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     3
"{ NameSpace: SmaCC }"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     4
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     5
Object subclass:#SmaCCRHS
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'collection reduceAction variableNames'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     7
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     8
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     9
	category:'SmaCC-Parser Generator'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
SmaCCRHS comment:'SmaCCRHS represents the right hand side of the production.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
Instance variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	collection	<OrderedCollection of: SmaCCSymbol> the collection of symbols that represent the rhs
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
	grammar <SmaCCGrammar> the grammar that the production is in
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
	variableNames	<Dictionary key: String value: Integer>	the name of each symbol in the rhs. These names can be used in the {} code blocks.'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
!SmaCCRHS class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	^(super new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
		initialize;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
!SmaCCRHS methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
add: aGrammarSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
	collection add: aGrammarSymbol
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
at: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
	^collection at: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
do: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
	collection do: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
firstTerminals
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
	| items |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
	collection isEmpty ifTrue: [^Set with: SmaCCSymbol empty].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
	items := Set new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
	1 to: collection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
		do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
			[:index | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
			items addAll: (collection at: index) firstTerminals.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
			(items includes: SmaCCSymbol empty) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
				ifTrue: [index < collection size ifTrue: [items remove: SmaCCSymbol empty]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
				ifFalse: [^items]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
	^items
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
nameLastItem: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
	variableNames at: aString put: collection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
reduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
	^reduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
reduceAction: anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
	reduceAction := anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
	^collection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
!SmaCCRHS methodsFor:'comparing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
= aRHS 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
	^self class = aRHS class and: [collection = aRHS collection]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
	^self class hash bitXor: (collection hash bitShift: 14)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
!SmaCCRHS methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
	collection := OrderedCollection new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
	reduceAction := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
	variableNames := Dictionary new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
!SmaCCRHS methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
printOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
	^collection do: [:each | each printOn: aStream]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
		separatedBy: [aStream space]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
!SmaCCRHS methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
collection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
	^collection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
defaultReduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
	^#reduceFor:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
!SmaCCRHS methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
compileSourceFor: aGrammarSymbol in: aClass
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
        | action rewriter parseTree methodName |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
        action := self reduceAction.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
        action isNil ifTrue: [^self defaultReduceAction].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
        parseTree := RBParser parseExpression: action
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
                                onError: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
                                        [:s :p | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
                                        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
                                            SmaCCCompilationNotification raiseSignal: 'Invalid Smalltalk code in reduction rule'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
                                                    with: aGrammarSymbol name , ' : ' , self printString , '\\' withCRs , action.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
                                        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
                                            SmaCCCompilationNotification signal: 'Invalid Smalltalk code in reduction rule'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
                                                    with: aGrammarSymbol name , ' : ' , self printString , '\\' withCRs , action.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
                                        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
                                        ^self defaultReduceAction].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
        (parseTree isLiteral and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
                        [parseTree value isSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
                                and: [parseTree value argumentCount <= 1 and: [aClass definesMethod: parseTree value]]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
                ifTrue: [^parseTree value].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
        rewriter := self parseTreeRewriter.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
        rewriter executeTree: parseTree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
        parseTree := rewriter tree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
        methodName := ('reduceActionFor' , (self safeMethodNameFor: aGrammarSymbol) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
                                , (aGrammarSymbol positionOf: self) printString , ':') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
                                asSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
        parseTree isSequence 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
                ifFalse: [parseTree := RBSequenceNode statements: (Array with: parseTree)].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
        parseTree := RBMethodNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
                                selector: methodName
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
                                arguments: (Array with: (RBVariableNode named: 'nodes'))
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
                                body: parseTree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
        parseTree addReturn.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
        aClass compile: parseTree formattedCode classified: 'generated-reduction actions'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
        ^methodName
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
parseTreeRewriter
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
	| rewriter |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
	rewriter := ParseTreeRewriter new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
	1 to: self size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
		do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
			[:i | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
			rewriter replace: i printString storeString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
				with: '(nodes at: ' , i printString , ')'].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
	variableNames keysAndValuesDo: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
			[:key :value | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
			rewriter replace: key with: '(nodes at: ' , value printString , ')'].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
	^rewriter
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
safeMethodNameFor: aGrammarSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
	^aGrammarSymbol printString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
		collect: [:each | each isAlphaNumeric ifTrue: [each] ifFalse: [$_]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
!SmaCCRHS class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCRHS.st,v 1.1 2006-02-09 21:14:42 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   169
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   170
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   171
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   172
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
! !