- stx_goodies_smaCC
added: #svnRepositoryUrlString
changed:
#classNamesAndAttributes
#extensionMethodNames
#preRequisites
- SmaCC::SmaCCRHS
changed: #parseTreeRewriter
"{ Package: 'stx:goodies/smaCC' }"
"{ NameSpace: SmaCC }"
SmaCCScanner subclass:#StScanner
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
category:'SmaCC-Example Parsers'
!
!StScanner class methodsFor:'accessing'!
frequencyTable
^#(0.0 1.31372e-7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0481767 0.0 0.0 0.0 0.0252514 0.0 0.0 2.62743e-7 1.31372e-7 5.25487e-7 1.31372e-7 1.31372e-7 0.0 1.31372e-7 0.0 2.62743e-7 0.0 1.31372e-7 7.8823e-7 2.62743e-7 2.62743e-7 1.31372e-7 5.25487e-7 0.106011 5.13007e-5 0.004554 0.00655584 2.41133e-4 3.60615e-5 1.93248e-4 0.00410241 0.00463893 0.0046369 2.82712e-4 4.64268e-4 0.0011675 9.75895e-4 0.00982753 2.26945e-4 0.00795055 0.00590903 0.0036363 0.00220212 0.00180485 0.00224265 0.00183191 0.00138545 0.00146217 0.00115246 0.0248349 0.00129723 7.50395e-4 0.00496762 8.97532e-4 1.44378e-4 0.00164497 0.00403659 0.00332443 0.00587547 0.00266882 0.00223293 0.00382922 9.91266e-4 9.99673e-4 0.00418163 3.27773e-5 6.31044e-4 0.00271013 0.00248917 0.00292348 0.00278226 0.00359742 7.08751e-4 0.00239287 0.00749351 0.00486778 0.00145908 0.00167453 0.00112251 2.2458e-4 2.32856e-4 4.40752e-5 0.00467815 1.22701e-4 0.00470173 0.00298378 7.73451e-4 2.634e-4 0.0515694 0.00918972 0.0257636 0.0226939 0.09244 0.0167193 0.0108988 0.0138365 0.042864 9.52379e-4 0.00366494 0.0402202 0.0159142 0.0440905 0.0418992 0.0154463 5.66869e-4 0.043972 0.0443068 0.0543899 0.0180997 0.00593537 0.00725816 0.00494884 0.00808567 0.00128285 7.45009e-4 0.00281083 7.45206e-4 1.08907e-4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.56859e-8 3.28429e-7 0.0 0.0 1.97058e-7 0.0 0.0 0.0 0.0 3.94115e-7 6.56859e-8 0.0 2.62743e-7 1.31372e-7 0.0 1.31372e-7 1.31372e-7 0.0 0.0 1.97058e-7 1.31372e-7 6.56859e-8 1.31372e-7 0.0 0.0 7.8823e-7 0.0 0.0 1.31372e-7 1.31372e-7 4.59801e-7 7.8823e-7 0.0 9.85288e-7 5.25487e-7 1.31372e-7 6.56859e-8 1.05097e-6 0.0 2.62743e-7 0.0 1.97058e-7 4.59801e-7 1.97058e-7 5.25487e-7 2.62743e-7 0.0 1.51078e-6 5.91173e-7 1.11666e-6 0.0 1.97058e-7 8.53916e-7 1.57646e-6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 6.56859e-8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.25487e-7 0.0 0.0 0.0 0.0 0.0 0.0 7.8823e-7 0.0 2.62743e-7 0.0 0.0 3.28429e-7 1.31372e-7 0.0 2.62743e-7 0.0 3.28429e-7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 2.62743e-7 0.0 5.25487e-7 0.0 0.0 1.31372e-7 0.0 0.0 0.0 0.0)
! !
!StScanner class methodsFor:'generated-comments'!
scannerDefinitionComment
"<name> : [a-zA-Z_] \w* ;
<number>: [0-9] ;
<negative_number> : \- <number> ;
<string> : \' [^\']* \' (\' [^\']* \')* ;
<keyword> : <name> \: ;
<multikeyword> : <name> \: (<name> \: )+ ;
<binary_symbol> : [\~\-\!!\@\%\&\*\+\=\\\|\?\/\>\<\,] [\~\!!\@\%\&\*\+\=\\\|\?\/\>\<\,]? ;
<whitespace> : \s+ ;
<comment> : \"" [^\""]* \"" ;
<dotted_name> : <name> (\. <name>)+ ;
<character> : \$ . ;
<variable_assignment> : <name> \: \= ;
<any_char> : . ; # For VW literal arrays that handle #(;) -> #(#';')"
! !
!StScanner class methodsFor:'generated-initialization'!
initializeKeywordMap
keywordMap := Dictionary new.
#(#(32 '0' #number) #(32 '1' #number) #(32 '2' #number) #(32 '3' #number) #(32 '4' #number) #(32 '5' #number) #(32 '6' #number) #(32 '7' #number) #(32 '8' #number) #(32 '9' #number) #(20 'false' 13) #(20 'nil' 10) #(20 'true' 14))
do:
[:each |
(keywordMap at: each first ifAbsentPut: [Dictionary new]) at: (each at: 2) put: each last].
^keywordMap
! !
!StScanner methodsFor:'generated-scanner'!
scan1
[self step.
currentCharacter ~~ $'] whileTrue.
^self scan2
!
scan2
self recordMatch: #(23).
self step.
currentCharacter == $' ifTrue: [^self scan1].
^self reportLastMatch
!
scan3
[self step.
currentCharacter isHexDigit or:
[(currentCharacter between: $G and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]]
whileTrue.
currentCharacter == $:
ifTrue:
[self recordMatch: #(25).
self step.
((currentCharacter between: $A and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]])
ifTrue: [^self scan3].
^self reportLastMatch].
^self reportLastMatch
!
scan4
self step.
((currentCharacter between: $A and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]])
ifTrue:
[
[self recordMatch: #(29).
self step.
currentCharacter isHexDigit or:
[(currentCharacter between: $G and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]]
whileTrue.
currentCharacter == $. ifTrue: [^self scan4].
^self reportLastMatch].
^self reportLastMatch
!
scan5
self recordMatch: #(24).
self step.
((currentCharacter between: $A and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]])
ifTrue: [^self scan3].
currentCharacter == $= ifTrue: [^self recordAndReportMatch: #variable_assignment].
^self reportLastMatch
!
scanForToken
self step.
((currentCharacter between: $A and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]])
ifTrue:
[self recordMatch: #(20 32).
self step.
(currentCharacter isHexDigit or:
[(currentCharacter between: $G and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]])
ifTrue:
[
[self recordMatch: #(20).
self step.
currentCharacter isHexDigit or:
[(currentCharacter between: $G and: $Z)
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]]
whileTrue.
currentCharacter == $: ifTrue: [^self scan5].
currentCharacter == $. ifTrue: [^self scan4].
^self reportLastMatch].
currentCharacter == $: ifTrue: [^self scan5].
currentCharacter == $. ifTrue: [^self scan4].
^self reportLastMatch].
((currentCharacter between: $ and: $
) or: [currentCharacter == $ ])
ifTrue:
[self recordMatch: #whitespace.
self step.
((currentCharacter between: $ and: $
) or: [currentCharacter == $ ])
ifTrue:
[
[self recordMatch: #whitespace.
self step.
(currentCharacter between: $ and: $
) or: [currentCharacter == $ ]]
whileTrue.
^self reportLastMatch].
^self reportLastMatch].
(currentCharacter isDigit or:
[currentCharacter <= $ or:
[(currentCharacter between: $ and: $)
or: [currentCharacter == $` or: [currentCharacter >= $]]]])
ifTrue: [^self recordAndReportMatch: #(32)].
currentCharacter == $:
ifTrue:
[self recordMatch: #(16 32).
self step.
currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(11)].
^self reportLastMatch].
currentCharacter == $. ifTrue: [^self recordAndReportMatch: #(5 32)].
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[currentCharacter == $= or:
[(currentCharacter between: $? and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $~]]]]]]])
ifTrue:
[self recordMatch: #(26 32).
self step.
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[(currentCharacter between: $< and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]])
ifTrue: [^self recordAndReportMatch: #(26)].
^self reportLastMatch].
currentCharacter == $# ifTrue: [^self recordAndReportMatch: #(4 32)].
currentCharacter == $] ifTrue: [^self recordAndReportMatch: #(12 32)].
currentCharacter == $[ ifTrue: [^self recordAndReportMatch: #(18 32)].
currentCharacter == $( ifTrue: [^self recordAndReportMatch: #(2 32)].
currentCharacter == $) ifTrue: [^self recordAndReportMatch: #(1 32)].
currentCharacter == $"
ifTrue:
[self recordMatch: #(32).
self step.
currentCharacter ~~ $"
ifTrue:
[
[self step.
currentCharacter ~~ $"] whileTrue.
^self recordAndReportMatch: #comment].
currentCharacter == $" ifTrue: [^self recordAndReportMatch: #comment].
^self reportLastMatch].
currentCharacter == $'
ifTrue:
[self recordMatch: #(32).
self step.
currentCharacter ~~ $' ifTrue: [^self scan1].
currentCharacter == $' ifTrue: [^self scan2].
^self reportLastMatch].
currentCharacter == $^ ifTrue: [^self recordAndReportMatch: #(19 32)].
currentCharacter == $|
ifTrue:
[self recordMatch: #(17 26 32).
self step.
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[(currentCharacter between: $< and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $~]]]]]])
ifTrue: [^self recordAndReportMatch: #(26)].
currentCharacter == $| ifTrue: [^self recordAndReportMatch: #(15 26)].
^self reportLastMatch].
currentCharacter == $; ifTrue: [^self recordAndReportMatch: #(9 32)].
currentCharacter == $-
ifTrue:
[self recordMatch: #(26 32).
self step.
currentCharacter isDigit ifTrue: [^self recordAndReportMatch: #negative_number].
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[(currentCharacter between: $< and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]])
ifTrue: [^self recordAndReportMatch: #(26)].
^self reportLastMatch].
currentCharacter == $>
ifTrue:
[self recordMatch: #(7 26 32).
self step.
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[(currentCharacter between: $< and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]])
ifTrue: [^self recordAndReportMatch: #(26)].
^self reportLastMatch].
currentCharacter == $<
ifTrue:
[self recordMatch: #(8 26 32).
self step.
(currentCharacter == $!! or:
[(currentCharacter between: $% and: $&) or:
[(currentCharacter between: $* and: $,) or:
[currentCharacter == $/ or:
[(currentCharacter between: $< and: $@)
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]])
ifTrue: [^self recordAndReportMatch: #(26)].
^self reportLastMatch].
currentCharacter == $} ifTrue: [^self recordAndReportMatch: #(3 32)].
currentCharacter == ${ ifTrue: [^self recordAndReportMatch: #(6 32)].
currentCharacter == $$
ifTrue:
[self recordMatch: #(32).
self step.
^self recordAndReportMatch: #(30)].
^self reportLastMatch
! !
!StScanner methodsFor:'generated-tokens'!
binary_symbolId
^26
!
emptySymbolTokenId
^63
!
errorTokenId
^64
!
nameId
^20
!
negative_numberId
^22
!
numberId
^21
! !
!StScanner methodsFor:'public'!
negative_number
stream skip: -2.
self scanNumber: self negative_numberId
!
number
stream skip: -1.
self scanNumber: self numberId
!
scanNumber: id
| token number |
number := Number readFrom: stream.
outputStream reset.
token := SmaCCToken
value: number
start: start
id: (Array with: id).
matchActions := nil.
returnMatchBlock value: token
!
variable_assignment
| token |
outputStream skip: -2.
stream skip: -2.
token := SmaCCToken
value: outputStream contents
start: start
id: (Array with: self nameId).
outputStream reset.
matchActions := nil.
returnMatchBlock value: token
! !
!StScanner class methodsFor:'documentation'!
version
^ '$Header: /opt/data/cvs/stx/goodies/smaCC/SmaCC__StScanner.st,v 1.1 2006-02-09 21:17:31 vranyj1 Exp $'
! !