SmaCC__SmaCCParser.st
author vranyj1
Wed, 14 Apr 2010 11:55:56 +0000
changeset 19 dde4420fb553
parent 17 0a5ab2588584
permissions -rw-r--r--
stc fixes
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:#SmaCCParser
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
     6
	instanceVariableNames:'scanner currentToken errorToken stateStack nodeStack'
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-Runtime'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    10
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    12
SmaCCParser comment:'SmaCCParser is an abstract class that defines most of the parsing actions. Subclasses will define methods that specify their transitions and reduction actions. These are normally defined automatically when compiling the parser.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    13
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    14
Subclasses must implement the following messages:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    15
	accessing
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    16
		emptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    17
		reduceTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    18
		transitionTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    19
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    20
Instance Variables:
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    21
	currentToken	<SmaCCToken>	the token last returned by the scanner that has not been shifted (reduce actions leave the current token alone)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    22
	nodeStack	<OrderedCollection>	collection of items on stack. These items are specific to the parser and can be any object. 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    23
	scanner	<SmaCCScanner>	our scanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    24
	stateStack	<OrderedCollection of: Integer>	the stack of states for our parser (standard LR state stack)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    25
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    26
'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    27
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    28
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    29
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    30
!SmaCCParser class methodsFor:'instance creation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    31
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    32
new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    33
	^(super new)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    34
		initialize;
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    35
		yourself
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    36
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    37
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    38
on: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    39
	| parser scanner |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    40
	scanner := self scannerClass on: aStream.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    41
	parser := self new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    42
	parser scanner: scanner.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    43
	^parser
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    44
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    45
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    46
!SmaCCParser class methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    47
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    48
parse: aString 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    49
	^self parse: aString startingAt: self defaultStartingState
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    50
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    51
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    52
parse: aString onError: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    53
        ^[self parse: aString] on: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    54
                do: [:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    55
                    Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    56
                        ex return: (aBlock value: ex description value: ex parameter position)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    57
                    ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    58
                    ex return: (aBlock value: ex description value: ex tag position)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    59
                ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    60
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    61
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    62
parse: aString startingAt: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    63
	^self parseStream: (ReadStream on: aString) startingAt: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    64
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    65
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    66
parse: aString startingAt: anInteger onError: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    67
        ^[self parse: aString startingAt: anInteger] on: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    68
                do: [:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    69
                    Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    70
                        ex return: (aBlock value: ex description value: ex parameter position)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    71
                    ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    72
                    ex return: (aBlock value: ex description value: ex tag position)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    73
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    74
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    75
parseStream: aStream 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    76
	^self parseStream: aStream startingAt: self defaultStartingState
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    77
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    78
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    79
parseStream: aStream onError: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    80
        ^[self parseStream: aStream] on: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    81
                do: [:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    82
                    Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    83
                        ex return: (aBlock value: ex description value: ex parameter position)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    84
                    ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    85
                    ex return: (aBlock value: ex description value: ex tag position)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    86
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    87
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    88
parseStream: aStream startingAt: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    89
	| parser |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    90
	parser := self on: aStream.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    91
	parser setStartingState: anInteger.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    92
	^parser parse
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    93
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    94
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    95
parseStream: aStream startingAt: anInteger onError: aBlock
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    96
        ^[self parseStream: aStream startingAt: anInteger] on: SmaCCParserError
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    97
                do: [:ex | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    98
                    Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
    99
                        ex return: (aBlock value: ex description value: ex parameter position)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   100
                    ].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   101
                    ex return: (aBlock value: ex description value: ex tag position)]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   102
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   103
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   104
!SmaCCParser class methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   105
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   106
defaultStartingState
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   107
	^1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   108
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   109
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   110
scannerClass
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   111
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   112
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   113
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   114
!SmaCCParser methodsFor:'accessing'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   115
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   116
emptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   117
	^scanner emptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   118
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   119
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   120
errorTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   121
	^#()
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   122
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   123
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   124
errorTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   125
	^scanner errorTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   126
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   127
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   128
parse
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   129
	self setDefaultStartingStateIfNone.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   130
	self performParsingLoop.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   131
	^nodeStack last
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   132
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   133
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   134
position
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   135
	^currentToken isNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   136
		ifTrue: [scanner position]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   137
		ifFalse: [currentToken startPosition]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   138
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   139
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   140
reduceTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   141
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   142
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   143
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   144
transitionTable
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   145
	^self subclassResponsibility
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   146
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   147
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   148
!SmaCCParser methodsFor:'initialize-release'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   149
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   150
initialize
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   151
	nodeStack := OrderedCollection new
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   152
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   153
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   154
scanner: aScanner 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   155
	scanner := aScanner
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   156
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   157
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   158
setStartingState: startingState 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   159
	stateStack := OrderedCollection with: startingState
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   160
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   161
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   162
!SmaCCParser methodsFor:'private'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   163
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   164
acceptAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   165
	^0
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   166
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   167
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   168
actionFor: aSymbolIndex 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   169
	^self actionForState: self currentState and: aSymbolIndex
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   170
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   171
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   172
actionForCurrentToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   173
	^self actionFor: currentToken id first
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   174
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   175
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   176
actionForState: stateIndex and: aSymbolIndex 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   177
	| index row |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   178
	row := self transitionTable at: stateIndex.
19
dde4420fb553 stc fixes
vranyj1
parents: 17
diff changeset
   179
	(row at: 1) == 0 
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   180
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   181
			[index := self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   182
						binarySearchIn: row
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   183
						for: aSymbolIndex
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   184
						size: 2.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   185
			index == 0 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   186
				ifTrue: [^self errorAction]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   187
				ifFalse: [^((row at: 2) bitShift: 8) + (row at: 3)]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   188
		ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   189
			[index := self 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   190
						binarySearchIn: row
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   191
						for: aSymbolIndex
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   192
						size: 4.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   193
			index == 0 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   194
				ifTrue: [^self errorAction]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   195
				ifFalse: [^((row at: index - 2) bitShift: 8) + (row at: index - 1)]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   196
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   197
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   198
actionMask
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   199
	^2r11
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   200
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   201
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   202
binarySearchIn: aRow for: aSymbolIndex size: step 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   203
	| start mid length high low midItem stop |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   204
	high := aSymbolIndex bitShift: -8.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   205
	low := aSymbolIndex bitAnd: 16rFF.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   206
	start := 4.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   207
	stop := aRow size - 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   208
	length := (stop - start) // step.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   209
	[length > 4] whileTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   210
			[length := length bitShift: -1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   211
			mid := length * step + start.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   212
			midItem := aRow at: mid.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   213
			((midItem == high and: [(aRow at: mid + 1) <= low]) or: [midItem < high]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   214
				ifTrue: [start := mid]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   215
				ifFalse: [stop := mid]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   216
	[start <= stop] whileTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   217
			[((aRow at: start) == high and: [(aRow at: start + 1) == low]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   218
				ifTrue: [^start].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   219
			start := start + step].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   220
	^0
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   221
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   222
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   223
currentState
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   224
	^stateStack last
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   225
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   226
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   227
errorAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   228
	^3
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   229
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   230
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   231
findErrorHandlerIfNoneUseErrorNumber: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   232
	| handlerStates index startingErrorToken newStack |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   233
	handlerStates := self errorHandlerStates reverse.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   234
	startingErrorToken := currentToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   235
	
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   236
	[index := (1 to: handlerStates size) detect: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   237
					[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   238
					| state |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   239
					state := handlerStates at: each.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   240
					state ~= 0 and: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   241
							[newStack := stateStack copyFrom: 1 to: handlerStates size - each + 1.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   242
							newStack add: state.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   243
							self willShift: newStack]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   244
				ifNone: [nil].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   245
	index isNil] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   246
			whileTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   247
				[self dismissErrorToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   248
				currentToken id first = self emptySymbolTokenId 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   249
					ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   250
						[currentToken := startingErrorToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   251
						self reportError: anInteger]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   252
	index - 1 timesRepeat: [self dismissStackTopForErrorRecovery].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   253
	stateStack addLast: (handlerStates at: index).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   254
	nodeStack addLast: startingErrorToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   255
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   256
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   257
getNextToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   258
	currentToken isNil ifTrue: [currentToken := scanner next]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   259
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   260
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   261
liftFirstValue: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   262
	^aCollection first
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   263
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   264
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   265
liftLastValue: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   266
	^aCollection last
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   267
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   268
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   269
liftSecondValue: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   270
	^aCollection at: 2
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   271
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   272
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   273
performParsingLoop
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   274
	| action actionType |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   275
	
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   276
	[self getNextToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   277
	action := self actionForCurrentToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   278
	action = self acceptAction] 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   279
			whileFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   280
				[actionType := action bitAnd: self actionMask.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   281
				action := action bitShift: -2.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   282
				actionType == self shiftAction 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   283
					ifTrue: [self shift: action]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   284
					ifFalse: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   285
						[actionType == self reduceAction 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   286
							ifTrue: [self reduce: action]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   287
							ifFalse: [self handleError: action]]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   288
	self checkForErrors
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   289
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   290
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   291
performReduceMethod: aSymbol with: items 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   292
	^aSymbol last == $: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   293
		ifTrue: [self perform: aSymbol with: items]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   294
		ifFalse: [self perform: aSymbol]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   295
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   296
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   297
reduce: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   298
	| reduceEntry items size |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   299
	reduceEntry := self reduceTable at: anInteger.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   300
	items := OrderedCollection new: (size := reduceEntry at: 2).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   301
	size timesRepeat: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   302
			[items addFirst: nodeStack removeLast.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   303
			stateStack removeLast].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   304
	nodeStack add: (self performReduceMethod: (reduceEntry at: 3) with: items).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   305
	stateStack add: ((self actionFor: (reduceEntry at: 1)) bitShift: -2)
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   306
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   307
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   308
reduceAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   309
	^2r10
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   310
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   311
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   312
reduceFor: aCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   313
	| newCollection item |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   314
	(aCollection allSatisfy: [:each | each class ~~ OrderedCollection]) 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   315
		ifTrue: [^aCollection].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   316
	aCollection first class == OrderedCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   317
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   318
			[newCollection := aCollection first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   319
			2 to: aCollection size
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   320
				do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   321
					[:i | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   322
					item := aCollection at: i.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   323
					item class = OrderedCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   324
						ifTrue: [newCollection addAll: item]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   325
						ifFalse: [newCollection add: item]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   326
			^newCollection].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   327
	newCollection := OrderedCollection new.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   328
	aCollection do: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   329
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   330
			each class == OrderedCollection 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   331
				ifTrue: [newCollection addAll: each]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   332
				ifFalse: [newCollection add: each]].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   333
	^newCollection
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   334
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   335
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   336
setDefaultStartingStateIfNone
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   337
	stateStack isNil 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   338
		ifTrue: [self setStartingState: self class defaultStartingState]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   339
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   340
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   341
shift: stateIndex 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   342
	stateStack add: stateIndex.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   343
	nodeStack add: currentToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   344
	currentToken := nil
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   345
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   346
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   347
shiftAction
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   348
	^2r01
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   349
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   350
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   351
!SmaCCParser methodsFor:'private-error handling'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   352
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   353
checkForErrors
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   354
	"If we have an error correction installed, we might have handled the errors. If we did, we don't 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   355
	want to return the result, so we raise a final exception that can't be proceeded."
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   356
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   357
	errorToken isNil ifTrue: [^self].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   358
	currentToken := errorToken.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   359
	self reportErrorMessage: 'Token not expected'
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   360
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   361
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   362
dismissErrorToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   363
	currentToken := nil.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   364
	self getNextToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   365
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   366
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   367
dismissStackTopForErrorRecovery
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   368
	stateStack removeLast.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   369
	^nodeStack removeLast
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   370
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   371
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   372
errorHandlerStates
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   373
	^stateStack collect: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   374
			[:each | 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   375
			| action |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   376
			action := self actionForState: each and: self errorTokenId.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   377
			(action bitAnd: self actionMask) = 1 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   378
				ifTrue: [action bitShift: -2]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   379
				ifFalse: [0]]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   380
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   381
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   382
handleError: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   383
	errorToken isNil ifTrue: [errorToken := currentToken].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   384
	(currentToken id first = self emptySymbolTokenId 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   385
		or: [self hasErrorHandler not]) ifTrue: [self reportError: anInteger].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   386
	self findErrorHandlerIfNoneUseErrorNumber: anInteger
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   387
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   388
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   389
hasErrorHandler
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   390
	^self errorHandlerStates anySatisfy: [:each | each ~~ 0]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   391
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   392
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   393
reportError: anInteger 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   394
	self reportErrorMessage: (anInteger = 0 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   395
				ifTrue: ['Token not expected']
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   396
				ifFalse: [self errorTable at: anInteger])
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   397
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   398
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   399
reportErrorMessage: aString
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   400
        Smalltalk isSmalltalkX ifTrue:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   401
            errorToken ifNotNil:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   402
                | errorMessage |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   403
                errorMessage := ((errorToken value = '') and:[scanner stream atEnd])
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   404
                                    ifTrue:['Unexpected end of file']
17
0a5ab2588584 symbolComment method now returns array containing id -> symbolic name pair
vranyj1
parents: 15
diff changeset
   405
                                    ifFalse:[aString].
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   406
                SmaCCParserError raiseSignal: errorMessage with: self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   407
            ] ifNil:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   408
                SmaCCParserError raiseSignal: aString with:self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   409
            ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   410
        ] ifFalse:[
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   411
            SmaCCParserError signal: aString with: self
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   412
        ]
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   413
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   414
    "Modified: / 05-01-2007 / 13:04:48 / janfrog"
17
0a5ab2588584 symbolComment method now returns array containing id -> symbolic name pair
vranyj1
parents: 15
diff changeset
   415
    "Modified: / 29-03-2010 / 13:15:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   416
!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   417
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   418
willShift: potentialStateStack 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   419
	| action compoundAction reduceEntry size |
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   420
	compoundAction := self actionForState: potentialStateStack last
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   421
				and: currentToken id first.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   422
	action := compoundAction bitAnd: self actionMask.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   423
	action == self shiftAction ifTrue: [^true].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   424
	action == self reduceAction 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   425
		ifTrue: 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   426
			[reduceEntry := self reduceTable at: (compoundAction bitShift: -2).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   427
			size := reduceEntry at: 2.
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   428
			size timesRepeat: [potentialStateStack removeLast].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   429
			potentialStateStack 
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   430
				add: ((self actionForState: potentialStateStack last
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   431
						and: (reduceEntry at: 1)) bitShift: -2).
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   432
			^self willShift: potentialStateStack].
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   433
	^false
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   434
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   435
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   436
!SmaCCParser methodsFor:'public'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   437
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   438
isEOFToken
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   439
	^currentToken id first = self emptySymbolTokenId
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   440
! !
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   441
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   442
!SmaCCParser class methodsFor:'documentation'!
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   443
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   444
version
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   445
    ^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__SmaCCParser.st,v 1.4 2007-01-05 15:16:41 vranyj1 Exp $'
15
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   446
!
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   447
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   448
version_SVN
8b8cd1701c33 added version_SVN method
vranyj1
parents: 1
diff changeset
   449
    ^ '$Id$'
1
b8cca2663544 Initial import
vranyj1
parents:
diff changeset
   450
! !