SmaCC__SmaCCScanner.st
author vranyj1
Mon, 10 Sep 2012 09:07:46 +0000
changeset 23 11ad79f459e6
parent 15 8b8cd1701c33
permissions -rw-r--r--
- stx_goodies_smaCC added: #svnRepositoryUrlString changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - SmaCC::SmaCCRHS changed: #parseTreeRewriter
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:#SmaCCScanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'stream start matchActions matchEnd currentCharacter outputStream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     7
		lastOutputStreamMatchPosition lastMatchWasEmpty returnMatchBlock'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     8
	classVariableNames:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     9
	poolDictionaries:''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
	category:'SmaCC-Runtime'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
SmaCCScanner class instanceVariableNames:'keywordMap'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
 No other class instance variables are inherited by this class.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
SmaCCScanner comment:'SmaCCScanner is an abstract class that represents a scanner for the parser. The scanner converts its string input into SmaCCToken objects that the parser then uses for its parsing.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
Subclasses must implement the following messages:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
	accessing
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
		scanForToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
Instance Variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
	currentCharacter	<Character>	the current character we are scanning
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
	lastMatchWasEmpty	<Boolean>	was our last scanning match an empty string -- don''t allow two empty matches in a row
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
	lastOutputStreamMatchPosition	<Integer>	the position in the outputStream of the last match
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
	matchActions	<Array | Symbol>	the actions for the last match (a symbol means that the action should be performed on the scanner)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
	matchEnd	<Integer>	the position of the last match in the stream (our input stream)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
	outputStream	<PositionableStream>	the matched characters go in this stream. After a match is made, we take this stream''s contents and create a token object.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
	returnMatchBlock	<BlockClosure>	when we match a token evaluate this block with the token (hack to return from multiple levels)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
	start	<Integer>	the starting position of a match in the stream
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
	stream	<Stream>	our input
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
!SmaCCScanner class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
	^(super new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
		initialize;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
on: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
	^(self new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
		on: (self needsLineNumbers 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
					ifTrue: [SmaCCLineNumberStream on: aStream]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
					ifFalse: [aStream]);
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
!SmaCCScanner class methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
frequencyTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
	^#(1)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
keywordMap
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
	keywordMap isNil ifTrue: [self initializeKeywordMap].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
	^keywordMap
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
!SmaCCScanner class methodsFor:'class initialization'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
	self initializeKeywordMap
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
initializeKeywordMap
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
	keywordMap := Dictionary new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
!SmaCCScanner class methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
needsLineNumbers
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
	"Redefine to return true, if you need line number information"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
	^false
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
!SmaCCScanner methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
	| writeStream token |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
	writeStream := WriteStream on: Array new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
	[self atEnd] whileFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
			[token := self next.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
			token notNil ifTrue: [writeStream nextPut: token]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
	^writeStream contents
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
emptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
errorTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
lineNumber
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
	"This requires the stream to be a line number stream (see the #needsLineNumbers class method)."
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
	^stream lineNumber
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
next
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
	self resetScanner.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
	returnMatchBlock := [:match | ^match].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
	self scanForToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
	^stream position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
position: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
	^stream position: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
scanForToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
	^self subclassResponsibility
2
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   127
!
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   128
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   129
stream
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   130
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   131
    ^stream
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   132
2db0a51151f9 added missing SmaCCScanner>>stream
vranyj1
parents: 1
diff changeset
   133
    "Created: / 06-06-2008 / 20:51:09 / Jan Vrany <vranyj1@fel.cvut.cz>"
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
!SmaCCScanner methodsFor:'default token handling'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
comment
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
	"In case someone wants to record the comments"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
	self whitespace
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
whitespace
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
        "By default, eat the whitespace"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
        self resetScanner.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
        self scanForToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
!SmaCCScanner methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
	outputStream := WriteStream on: (String new: self initialBufferSize).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
	lastMatchWasEmpty := true
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
on: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
	stream := aStream.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
	start := stream position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
!SmaCCScanner methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
checkForKeyword: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
	| stateMap action |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
	action := matchActions isSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
				ifTrue: [matchActions]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
				ifFalse: [matchActions first].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
	stateMap := self class keywordMap at: action ifAbsent: [nil].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
	stateMap isNil ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
	matchActions := stateMap at: (self keywordFor: aString)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
				ifAbsent: [matchActions].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
	matchActions isInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
		ifTrue: [matchActions := Array with: matchActions with: action]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
checkForValidMatch
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   179
	matchActions isNil ifTrue: [self scannerError]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
createTokenFor: string 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
	| token |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
	token := SmaCCToken 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
				value: string
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
				start: start
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
				id: matchActions.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
	outputStream reset.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
	matchActions := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
	returnMatchBlock value: token
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
initialBufferSize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
	^128
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
recordAndReportMatch: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
	self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
		recordMatch: aCollection;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
		reportLastMatch
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
recordMatch: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
	matchActions := aCollection.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
	matchEnd := stream position.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
	lastOutputStreamMatchPosition := outputStream position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
reportLastMatch
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
        "The scanner has found the end of a token and must report it"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
        | string |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
        self checkForValidMatch.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
        self resetOutputToLastMatch.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
        stream position: matchEnd.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
        string := outputStream contents.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
            outputStream reset.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
        self checkForKeyword: string.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
        matchActions isSymbol 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
                ifTrue: [self perform: matchActions]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
                ifFalse: [self createTokenFor: string]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
resetOutputToLastMatch
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
        |streamStartPosition|
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
        outputStream position: lastOutputStreamMatchPosition.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
            streamStartPosition := outputStream class zeroPosition.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
            streamStartPosition := 0.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
        lastOutputStreamMatchPosition == streamStartPosition 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
                ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
                        [lastMatchWasEmpty ifTrue: [self scannerError].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
                        lastMatchWasEmpty := true]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
                ifFalse: [lastMatchWasEmpty := false]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
resetScanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
        start := stream position.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
        outputStream reset.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
            lastOutputStreamMatchPosition := outputStream class zeroPosition .
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
            lastOutputStreamMatchPosition := 0 .
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
        ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   251
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   252
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   253
scannerError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   254
	(stream atEnd and: [start == stream position]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   256
			[returnMatchBlock value: (SmaCCToken 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   257
						value: ''
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   258
						start: stream position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   259
						id: (Array with: self emptySymbolTokenId))].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   260
	stream position: start.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   261
	returnMatchBlock value: (SmaCCToken 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   262
				value: (String with: stream next)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   263
				start: start
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   264
				id: #(0))
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   265
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   266
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   267
step
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   268
	stream atEnd ifTrue: [^self reportLastMatch].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   269
	currentCharacter := stream next.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   270
	outputStream nextPut: currentCharacter
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   271
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   272
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   273
!SmaCCScanner methodsFor:'private-utility'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   274
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   275
keywordFor: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   276
	"Subclasses can override this to ignore case"
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   277
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   278
	^aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   279
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   280
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   281
!SmaCCScanner methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   282
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   283
atEnd
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   284
	^stream atEnd
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   285
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   286
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   287
!SmaCCScanner class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   288
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   289
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   290
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCScanner.st,v 1.1 2006-02-09 21:15:31 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 2
diff changeset
   291
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 2
diff changeset
   292
8b8cd1701c33 added version_SVN method
vranyj1
parents: 2
diff changeset
   293
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 2
diff changeset
   294
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   295
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   296
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   297
SmaCCScanner initialize!