SmaCC__SmaCCRHS.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 07 Dec 2016 13:18:16 +0000
changeset 26 b2c091b8cea1
parent 25 5a6921729520
permissions -rw-r--r--
Fixed initialization of SmaCCEdge There's no `UnicodeString` anymore. Changed: WriteStream on: UnicodeString new to: String new writeStream
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
25
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    57
lastTerminals
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    58
        | items |
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    59
        collection isEmpty ifTrue: [^Set with: SmaCCSymbol empty].
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    60
        items := Set new.
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    61
        collection size downTo: 1 
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    62
                do: 
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    63
                        [:index | 
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    64
                        items addAll: (collection at: index) lastTerminals.
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    65
                        (items includes: SmaCCSymbol empty) 
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    66
                                ifTrue: [index > 1 ifTrue: [items remove: SmaCCSymbol empty]]
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    67
                                ifFalse: [^items]].
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    68
        ^items
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    69
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    70
    "Created: / 24-02-2016 / 09:51:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    71
!
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
    72
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
nameLastItem: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
	variableNames at: aString put: collection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
reduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
	^reduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
reduceAction: anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
	reduceAction := anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
	^collection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
!SmaCCRHS methodsFor:'comparing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
= aRHS 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
	^self class = aRHS class and: [collection = aRHS collection]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
hash
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
	^self class hash bitXor: (collection hash bitShift: 14)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
!SmaCCRHS methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
	collection := OrderedCollection new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
	reduceAction := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
	variableNames := Dictionary new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
!SmaCCRHS methodsFor:'printing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
printOn: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
	^collection do: [:each | each printOn: aStream]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
		separatedBy: [aStream space]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
!SmaCCRHS methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
collection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
	^collection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
defaultReduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
	^#reduceFor:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
!SmaCCRHS methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
compileSourceFor: aGrammarSymbol in: aClass
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
        | action rewriter parseTree methodName |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
        action := self reduceAction.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
        action isNil ifTrue: [^self defaultReduceAction].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
        parseTree := RBParser parseExpression: action
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
                                onError: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
                                        [:s :p | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
                                        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
                                            SmaCCCompilationNotification raiseSignal: 'Invalid Smalltalk code in reduction rule'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
                                                    with: aGrammarSymbol name , ' : ' , self printString , '\\' withCRs , action.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
                                        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
                                            SmaCCCompilationNotification signal: 'Invalid Smalltalk code in reduction rule'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
                                                    with: aGrammarSymbol name , ' : ' , self printString , '\\' withCRs , action.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
                                        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
                                        ^self defaultReduceAction].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
        (parseTree isLiteral and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
                        [parseTree value isSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
                                and: [parseTree value argumentCount <= 1 and: [aClass definesMethod: parseTree value]]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
                ifTrue: [^parseTree value].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
        rewriter := self parseTreeRewriter.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
        rewriter executeTree: parseTree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
        parseTree := rewriter tree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
        methodName := ('reduceActionFor' , (self safeMethodNameFor: aGrammarSymbol) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
                                , (aGrammarSymbol positionOf: self) printString , ':') 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
                                asSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
        parseTree isSequence 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
                ifFalse: [parseTree := RBSequenceNode statements: (Array with: parseTree)].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
        parseTree := RBMethodNode 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
                                selector: methodName
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
                                arguments: (Array with: (RBVariableNode named: 'nodes'))
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
                                body: parseTree.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
        parseTree addReturn.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
        aClass compile: parseTree formattedCode classified: 'generated-reduction actions'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
        ^methodName
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
parseTreeRewriter
23
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   163
        | rewriter |
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   164
        rewriter := ParseTreeRewriter basicNew initialize.
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   165
        1 to: self size
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   166
                do: 
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   167
                        [:i | 
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   168
                        rewriter replace: i printString storeString
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   169
                                with: '(nodes at: ' , i printString , ')'].
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   170
        variableNames keysAndValuesDo: 
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   171
                        [:key :value | 
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   172
                        rewriter replace: key with: '(nodes at: ' , value printString , ')'].
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   173
        ^rewriter
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   174
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   175
    "Modified: / 10-09-2012 / 10:04:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
safeMethodNameFor: aGrammarSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
	^aGrammarSymbol printString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
		collect: [:each | each isAlphaNumeric ifTrue: [each] ifFalse: [$_]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
!SmaCCRHS class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
version
23
11ad79f459e6 - stx_goodies_smaCC
vranyj1
parents: 15
diff changeset
   186
    ^ '$Id$'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   187
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   188
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   189
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   190
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
! !
25
5a6921729520 UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents: 23
diff changeset
   192