SmaCC__SmaCCScannerCompiler.st
author vranyj1
Wed, 17 Nov 2010 21:57:55 +0000
changeset 20 4ea23addc2c4
parent 15 8b8cd1701c33
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:#SmaCCScannerCompiler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'grammar scannerClass scannerDefinitionString'
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
SmaCCScannerCompiler comment:'SmaCCScannerCompiler represents the compiler for the scanner part of the parser.
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
	grammar	<SmaCCGrammar>	the grammar that defines the scanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
	scannerClass	<RBAbstractClass>	the class to compile the scanner into
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
	scannerDefinitionString	<String>	the string that defines the scanner'
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
!SmaCCScannerCompiler methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
scannerClass
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	^scannerClass
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
scannerClass: anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
	scannerClass := anObject
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
scannerDefinitionString: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
	scannerDefinitionString := aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
symbols
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
	^grammar symbols
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
!SmaCCScannerCompiler methodsFor:'compiling-scanner'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
addActionsForSymbols
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
        | selectorMap |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
        selectorMap := Dictionary new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
        (1 to: self symbols size) with: self symbols
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
                do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
                        [:index :each | |eachRegex selector|
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
                        eachRegex := each regularExpression.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
                        eachRegex notNil ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
                                        [
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
                                        selector := (self scannerActionFor: each name). 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
                                        selector notNil ifTrue: [selectorMap at: index put: selector].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
                                        eachRegex action: index].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
                        each createIdMethod ifTrue: [self compileTokenIdMethodFor: each]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
        ^selectorMap
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
addSpecialSymbols
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
	grammar tokens keysDo: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
			(self scannerActionFor: each) notNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
				ifTrue: [grammar terminalSymbolNamed: each]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
compileEmptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
        stream := WriteStream on: (String new: 100).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
                nextPutAll: 'emptySymbolTokenId';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
                tab;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
                nextPutAll: '^';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
                nextPutAll: (self symbols identityIndexOf: SmaCCSymbol empty) printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
        self scannerClass compile: stream contents classified: #'generated-tokens'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
    "Modified: / 06-09-2005 / 20:41:47 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
compileErrorSymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
        stream := WriteStream on: (String new: 100).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
                nextPutAll: 'errorTokenId';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
                tab;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
                nextPutAll: '^';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
                nextPutAll: (self symbols identityIndexOf: SmaCCSymbol error) printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
        self scannerClass compile: stream contents classified: #'generated-tokens'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
    "Modified: / 06-09-2005 / 20:41:58 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
compileKeywordInitializerUsing: aDictionary selectorMap: selectorMapDictionary 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
	| stream dataStream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
	aDictionary isEmpty ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
	stream := WriteStream on: String new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
	stream nextPutAll: 'initializeKeywordMap'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
	stream nextPutAll: ' keywordMap :=  Dictionary new. '.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
	dataStream := WriteStream on: Array new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
	aDictionary keysAndValuesDo: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
			[:key :value | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
			value keys asSortedCollection do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
					[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
					dataStream nextPut: (Array 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
								with: (selectorMapDictionary at: key ifAbsent: [key])
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
								with: each
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
								with: (selectorMapDictionary at: (value at: each) ifAbsent: [value at: each]))]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
	stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
		nextPutAll: '#(';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
		cr.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
	dataStream contents do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
			stream nextPutAll: '#('.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
			each do: [:item | item storeOn: stream] separatedBy: [stream nextPut: $ ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
			stream nextPut: $)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
		separatedBy: [stream cr].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
	stream nextPut: $).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
	stream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
		nextPutAll: ' do: [:each | (keywordMap at: each first ifAbsentPut: [Dictionary new]) at: (each at: 2) put: each last]. ^keywordMap'.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
	scannerClass metaclass 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
		compile: (RBParser parseMethod: stream contents) formattedCode
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
		classified: #'generated-initialization'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
compileScanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
	| regex selectorMap regexPartition dfa keywordmap |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
	regex := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
	self addSpecialSymbols.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
	grammar 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
		symbols: (self symbols asSortedCollection: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
					[:a :b | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
					| aRegex bRegex |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
					aRegex := a regularExpression.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
					bRegex := b regularExpression.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
					bRegex isNil or: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
							[aRegex notNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
								and: [(aRegex position ifNil: [0]) < (bRegex position ifNil: [0])]]]).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
	selectorMap := self addActionsForSymbols.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
	regexPartition := self regularExpressionsPartitionedByIsKeyword.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
	regex := self generalRegexesFrom: regexPartition.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
	dfa := regex asDFA.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
	keywordmap := Dictionary new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
	(regexPartition at: true ifAbsent: [#()]) do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
			| action strings newAction |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
			strings := each possibleMatches.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
			1 to: strings size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
				do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
					[:i | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
					newAction := dfa simulate: (ReadStream on: (strings at: i)).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
					i = 1 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
						ifTrue: [action := newAction]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
						ifFalse: [action = newAction ifFalse: [action := nil]]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
			action isNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
				ifTrue: [regex := regex | each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
				ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
					[action do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
							[:state | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
							strings do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
									[:string | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
									(keywordmap at: state ifAbsentPut: [Dictionary new]) at: string
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
										put: each action]]]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
	self compileKeywordInitializerUsing: keywordmap selectorMap: selectorMap.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
	regex asDFA compileInto: scannerClass usingSelectorMap: selectorMap.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
	self compileEmptySymbolTokenId.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
	self compileErrorSymbolTokenId.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
	SmaCCGrammar ignoreCase 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
			[scannerClass compile: 'keywordFor: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
	^aString asUppercase'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
				classified: #'generated-scanner']
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
compileScannerDefinitionComment
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
        stream := WriteStream on: (String new: 1000).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
                nextPutAll: 'scannerDefinitionComment';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
                tab;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
                nextPut: $";
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
                nextPutAll: (scannerDefinitionString copyReplaceAll: $" withAll:'""');
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
                nextPut: $".
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
        self scannerClass metaclass compile: stream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
                classified: #'generated-comments'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
compileTokenIdMethodFor: aTerminalSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
        | stream |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
        stream := WriteStream on: (String new: 1000).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
        stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
                nextPutAll: (aTerminalSymbol name copyFrom: 2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
                                        to: aTerminalSymbol name size - 1);
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
                nextPutAll: 'Id';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
                cr;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
                tab;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
                nextPutAll: '^';
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
                nextPutAll: (self symbols identityIndexOf: aTerminalSymbol) printString.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
        scannerClass compile: stream contents classified: #'generated-tokens'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
    "Modified: / 06-09-2005 / 20:42:43 / janfrog"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
generalRegexesFrom: regexPartition 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
	| regexs combinedRegex |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
	regexs := regexPartition at: false ifAbsent: [regexPartition at: true].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
	combinedRegex := regexs first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
	2 to: regexs size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
		do: [:i | combinedRegex := combinedRegex | (regexs at: i)].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
	^combinedRegex
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
regularExpressionsPartitionedByIsKeyword
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
        | regexPartition |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
        regexPartition := Dictionary new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
        self symbols do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
                        [:each |  |regex|
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
                        regex := each regularExpression.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
                        regex notNil ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
                                        [
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
                                        (regexPartition at: regex isKeywordLiteral
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
                                                ifAbsentPut: [OrderedCollection new]) add: regex]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
        ^regexPartition
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
scannerActionFor: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
	| selector |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
	aString size > 2 ifFalse: [^nil].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
	selector := (aString copyFrom: 2 to: aString size - 1) asSymbol.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
	^((scannerClass definesMethod: selector) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
		and: [(Object canUnderstand: selector) not and: [selector argumentCount = 0]]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
			ifTrue: [selector]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
			ifFalse: [nil]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
!SmaCCScannerCompiler methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
grammar: aGrammar
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
	grammar := aGrammar
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
parseTokens
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
	grammar tokens: (SmaCCScannerParser parse: scannerDefinitionString)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
!SmaCCScannerCompiler class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCScannerCompiler.st,v 1.1 2006-02-09 21:14:22 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   251
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   252
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   253
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   254
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
! !