author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Wed, 07 Dec 2016 13:18:16 +0000 | |
changeset 26 | b2c091b8cea1 |
parent 25 | 5a6921729520 |
permissions | -rw-r--r-- |
1 | 1 |
"{ Package: 'stx:goodies/smaCC' }" |
2 |
||
3 |
"{ NameSpace: SmaCC }" |
|
4 |
||
5 |
SmaCCScanner subclass:#StScanner |
|
6 |
instanceVariableNames:'' |
|
7 |
classVariableNames:'' |
|
8 |
poolDictionaries:'' |
|
9 |
category:'SmaCC-Example Parsers' |
|
10 |
! |
|
11 |
||
12 |
||
13 |
!StScanner class methodsFor:'accessing'! |
|
14 |
||
15 |
frequencyTable |
|
16 |
^#(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) |
|
17 |
! ! |
|
18 |
||
19 |
!StScanner class methodsFor:'generated-comments'! |
|
20 |
||
21 |
scannerDefinitionComment |
|
22 |
||
23 |
"<name> : [a-zA-Z_] \w* ; |
|
24 |
<number>: [0-9] ; |
|
25 |
<negative_number> : \- <number> ; |
|
26 |
<string> : \' [^\']* \' (\' [^\']* \')* ; |
|
27 |
<keyword> : <name> \: ; |
|
28 |
<multikeyword> : <name> \: (<name> \: )+ ; |
|
29 |
<binary_symbol> : [\~\-\!!\@\%\&\*\+\=\\\|\?\/\>\<\,] [\~\!!\@\%\&\*\+\=\\\|\?\/\>\<\,]? ; |
|
30 |
<whitespace> : \s+ ; |
|
31 |
<comment> : \"" [^\""]* \"" ; |
|
32 |
<dotted_name> : <name> (\. <name>)+ ; |
|
33 |
<character> : \$ . ; |
|
34 |
<variable_assignment> : <name> \: \= ; |
|
35 |
||
36 |
<any_char> : . ; # For VW literal arrays that handle #(;) -> #(#';')" |
|
37 |
! ! |
|
38 |
||
39 |
!StScanner class methodsFor:'generated-initialization'! |
|
40 |
||
41 |
initializeKeywordMap |
|
42 |
keywordMap := Dictionary new. |
|
43 |
#(#(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)) |
|
44 |
do: |
|
45 |
[:each | |
|
46 |
(keywordMap at: each first ifAbsentPut: [Dictionary new]) at: (each at: 2) put: each last]. |
|
47 |
^keywordMap |
|
48 |
! ! |
|
49 |
||
50 |
!StScanner methodsFor:'generated-scanner'! |
|
51 |
||
52 |
scan1 |
|
53 |
||
54 |
[self step. |
|
55 |
currentCharacter ~~ $'] whileTrue. |
|
56 |
^self scan2 |
|
57 |
! |
|
58 |
||
59 |
scan2 |
|
60 |
self recordMatch: #(23). |
|
61 |
self step. |
|
62 |
currentCharacter == $' ifTrue: [^self scan1]. |
|
63 |
^self reportLastMatch |
|
64 |
! |
|
65 |
||
66 |
scan3 |
|
67 |
||
68 |
[self step. |
|
69 |
currentCharacter isHexDigit or: |
|
70 |
[(currentCharacter between: $G and: $Z) |
|
71 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]] |
|
72 |
whileTrue. |
|
73 |
currentCharacter == $: |
|
74 |
ifTrue: |
|
75 |
[self recordMatch: #(25). |
|
76 |
self step. |
|
77 |
((currentCharacter between: $A and: $Z) |
|
78 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]) |
|
79 |
ifTrue: [^self scan3]. |
|
80 |
^self reportLastMatch]. |
|
81 |
^self reportLastMatch |
|
82 |
! |
|
83 |
||
84 |
scan4 |
|
85 |
self step. |
|
86 |
((currentCharacter between: $A and: $Z) |
|
87 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]) |
|
88 |
ifTrue: |
|
89 |
[ |
|
90 |
[self recordMatch: #(29). |
|
91 |
self step. |
|
92 |
currentCharacter isHexDigit or: |
|
93 |
[(currentCharacter between: $G and: $Z) |
|
94 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]] |
|
95 |
whileTrue. |
|
96 |
currentCharacter == $. ifTrue: [^self scan4]. |
|
97 |
^self reportLastMatch]. |
|
98 |
^self reportLastMatch |
|
99 |
! |
|
100 |
||
101 |
scan5 |
|
102 |
self recordMatch: #(24). |
|
103 |
self step. |
|
104 |
((currentCharacter between: $A and: $Z) |
|
105 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]) |
|
106 |
ifTrue: [^self scan3]. |
|
107 |
currentCharacter == $= ifTrue: [^self recordAndReportMatch: #variable_assignment]. |
|
108 |
^self reportLastMatch |
|
109 |
! |
|
110 |
||
111 |
scanForToken |
|
112 |
self step. |
|
113 |
((currentCharacter between: $A and: $Z) |
|
114 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]) |
|
115 |
ifTrue: |
|
116 |
[self recordMatch: #(20 32). |
|
117 |
self step. |
|
118 |
(currentCharacter isHexDigit or: |
|
119 |
[(currentCharacter between: $G and: $Z) |
|
120 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]) |
|
121 |
ifTrue: |
|
122 |
[ |
|
123 |
[self recordMatch: #(20). |
|
124 |
self step. |
|
125 |
currentCharacter isHexDigit or: |
|
126 |
[(currentCharacter between: $G and: $Z) |
|
127 |
or: [currentCharacter == $_ or: [currentCharacter between: $a and: $z]]]] |
|
128 |
whileTrue. |
|
129 |
currentCharacter == $: ifTrue: [^self scan5]. |
|
130 |
currentCharacter == $. ifTrue: [^self scan4]. |
|
131 |
^self reportLastMatch]. |
|
132 |
currentCharacter == $: ifTrue: [^self scan5]. |
|
133 |
currentCharacter == $. ifTrue: [^self scan4]. |
|
134 |
^self reportLastMatch]. |
|
135 |
((currentCharacter between: $ and: $ |
|
136 |
) or: [currentCharacter == $ ]) |
|
137 |
ifTrue: |
|
138 |
[self recordMatch: #whitespace. |
|
139 |
self step. |
|
140 |
((currentCharacter between: $ and: $ |
|
141 |
) or: [currentCharacter == $ ]) |
|
142 |
ifTrue: |
|
143 |
[ |
|
144 |
[self recordMatch: #whitespace. |
|
145 |
self step. |
|
146 |
(currentCharacter between: $ and: $ |
|
147 |
) or: [currentCharacter == $ ]] |
|
148 |
whileTrue. |
|
149 |
^self reportLastMatch]. |
|
150 |
^self reportLastMatch]. |
|
151 |
(currentCharacter isDigit or: |
|
152 |
[currentCharacter <= $ or: |
|
153 |
[(currentCharacter between: $ and: $) |
|
154 |
or: [currentCharacter == $` or: [currentCharacter >= $]]]]) |
|
155 |
ifTrue: [^self recordAndReportMatch: #(32)]. |
|
156 |
currentCharacter == $: |
|
157 |
ifTrue: |
|
158 |
[self recordMatch: #(16 32). |
|
159 |
self step. |
|
160 |
currentCharacter == $= ifTrue: [^self recordAndReportMatch: #(11)]. |
|
161 |
^self reportLastMatch]. |
|
162 |
currentCharacter == $. ifTrue: [^self recordAndReportMatch: #(5 32)]. |
|
163 |
(currentCharacter == $!! or: |
|
164 |
[(currentCharacter between: $% and: $&) or: |
|
165 |
[(currentCharacter between: $* and: $,) or: |
|
166 |
[currentCharacter == $/ or: |
|
167 |
[currentCharacter == $= or: |
|
168 |
[(currentCharacter between: $? and: $@) |
|
169 |
or: [currentCharacter == $\ or: [currentCharacter == $~]]]]]]]) |
|
170 |
ifTrue: |
|
171 |
[self recordMatch: #(26 32). |
|
172 |
self step. |
|
173 |
(currentCharacter == $!! or: |
|
174 |
[(currentCharacter between: $% and: $&) or: |
|
175 |
[(currentCharacter between: $* and: $,) or: |
|
176 |
[currentCharacter == $/ or: |
|
177 |
[(currentCharacter between: $< and: $@) |
|
178 |
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]]) |
|
179 |
ifTrue: [^self recordAndReportMatch: #(26)]. |
|
180 |
^self reportLastMatch]. |
|
181 |
currentCharacter == $# ifTrue: [^self recordAndReportMatch: #(4 32)]. |
|
182 |
currentCharacter == $] ifTrue: [^self recordAndReportMatch: #(12 32)]. |
|
183 |
currentCharacter == $[ ifTrue: [^self recordAndReportMatch: #(18 32)]. |
|
184 |
currentCharacter == $( ifTrue: [^self recordAndReportMatch: #(2 32)]. |
|
185 |
currentCharacter == $) ifTrue: [^self recordAndReportMatch: #(1 32)]. |
|
186 |
currentCharacter == $" |
|
187 |
ifTrue: |
|
188 |
[self recordMatch: #(32). |
|
189 |
self step. |
|
190 |
currentCharacter ~~ $" |
|
191 |
ifTrue: |
|
192 |
[ |
|
193 |
[self step. |
|
194 |
currentCharacter ~~ $"] whileTrue. |
|
195 |
^self recordAndReportMatch: #comment]. |
|
196 |
currentCharacter == $" ifTrue: [^self recordAndReportMatch: #comment]. |
|
197 |
^self reportLastMatch]. |
|
198 |
currentCharacter == $' |
|
199 |
ifTrue: |
|
200 |
[self recordMatch: #(32). |
|
201 |
self step. |
|
202 |
currentCharacter ~~ $' ifTrue: [^self scan1]. |
|
203 |
currentCharacter == $' ifTrue: [^self scan2]. |
|
204 |
^self reportLastMatch]. |
|
205 |
currentCharacter == $^ ifTrue: [^self recordAndReportMatch: #(19 32)]. |
|
206 |
currentCharacter == $| |
|
207 |
ifTrue: |
|
208 |
[self recordMatch: #(17 26 32). |
|
209 |
self step. |
|
210 |
(currentCharacter == $!! or: |
|
211 |
[(currentCharacter between: $% and: $&) or: |
|
212 |
[(currentCharacter between: $* and: $,) or: |
|
213 |
[currentCharacter == $/ or: |
|
214 |
[(currentCharacter between: $< and: $@) |
|
215 |
or: [currentCharacter == $\ or: [currentCharacter == $~]]]]]]) |
|
216 |
ifTrue: [^self recordAndReportMatch: #(26)]. |
|
217 |
currentCharacter == $| ifTrue: [^self recordAndReportMatch: #(15 26)]. |
|
218 |
^self reportLastMatch]. |
|
219 |
currentCharacter == $; ifTrue: [^self recordAndReportMatch: #(9 32)]. |
|
220 |
currentCharacter == $- |
|
221 |
ifTrue: |
|
222 |
[self recordMatch: #(26 32). |
|
223 |
self step. |
|
224 |
currentCharacter isDigit ifTrue: [^self recordAndReportMatch: #negative_number]. |
|
225 |
(currentCharacter == $!! or: |
|
226 |
[(currentCharacter between: $% and: $&) or: |
|
227 |
[(currentCharacter between: $* and: $,) or: |
|
228 |
[currentCharacter == $/ or: |
|
229 |
[(currentCharacter between: $< and: $@) |
|
230 |
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]]) |
|
231 |
ifTrue: [^self recordAndReportMatch: #(26)]. |
|
232 |
^self reportLastMatch]. |
|
233 |
currentCharacter == $> |
|
234 |
ifTrue: |
|
235 |
[self recordMatch: #(7 26 32). |
|
236 |
self step. |
|
237 |
(currentCharacter == $!! or: |
|
238 |
[(currentCharacter between: $% and: $&) or: |
|
239 |
[(currentCharacter between: $* and: $,) or: |
|
240 |
[currentCharacter == $/ or: |
|
241 |
[(currentCharacter between: $< and: $@) |
|
242 |
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]]) |
|
243 |
ifTrue: [^self recordAndReportMatch: #(26)]. |
|
244 |
^self reportLastMatch]. |
|
245 |
currentCharacter == $< |
|
246 |
ifTrue: |
|
247 |
[self recordMatch: #(8 26 32). |
|
248 |
self step. |
|
249 |
(currentCharacter == $!! or: |
|
250 |
[(currentCharacter between: $% and: $&) or: |
|
251 |
[(currentCharacter between: $* and: $,) or: |
|
252 |
[currentCharacter == $/ or: |
|
253 |
[(currentCharacter between: $< and: $@) |
|
254 |
or: [currentCharacter == $\ or: [currentCharacter == $| or: [currentCharacter == $~]]]]]]]) |
|
255 |
ifTrue: [^self recordAndReportMatch: #(26)]. |
|
256 |
^self reportLastMatch]. |
|
257 |
currentCharacter == $} ifTrue: [^self recordAndReportMatch: #(3 32)]. |
|
258 |
currentCharacter == ${ ifTrue: [^self recordAndReportMatch: #(6 32)]. |
|
259 |
currentCharacter == $$ |
|
260 |
ifTrue: |
|
261 |
[self recordMatch: #(32). |
|
262 |
self step. |
|
263 |
^self recordAndReportMatch: #(30)]. |
|
264 |
^self reportLastMatch |
|
265 |
! ! |
|
266 |
||
267 |
!StScanner methodsFor:'generated-tokens'! |
|
268 |
||
269 |
binary_symbolId |
|
270 |
^26 |
|
271 |
! |
|
272 |
||
273 |
emptySymbolTokenId |
|
274 |
^63 |
|
275 |
! |
|
276 |
||
277 |
errorTokenId |
|
278 |
^64 |
|
279 |
! |
|
280 |
||
281 |
nameId |
|
282 |
^20 |
|
283 |
! |
|
284 |
||
285 |
negative_numberId |
|
286 |
^22 |
|
287 |
! |
|
288 |
||
289 |
numberId |
|
290 |
^21 |
|
291 |
! ! |
|
292 |
||
293 |
!StScanner methodsFor:'public'! |
|
294 |
||
295 |
negative_number |
|
296 |
stream skip: -2. |
|
297 |
self scanNumber: self negative_numberId |
|
298 |
! |
|
299 |
||
300 |
number |
|
301 |
stream skip: -1. |
|
302 |
self scanNumber: self numberId |
|
303 |
! |
|
304 |
||
305 |
scanNumber: id |
|
306 |
| token number | |
|
307 |
number := Number readFrom: stream. |
|
308 |
outputStream reset. |
|
309 |
token := SmaCCToken |
|
310 |
value: number |
|
311 |
start: start |
|
312 |
id: (Array with: id). |
|
313 |
matchActions := nil. |
|
314 |
returnMatchBlock value: token |
|
315 |
! |
|
316 |
||
317 |
variable_assignment |
|
318 |
| token | |
|
319 |
outputStream skip: -2. |
|
320 |
stream skip: -2. |
|
321 |
token := SmaCCToken |
|
322 |
value: outputStream contents |
|
323 |
start: start |
|
324 |
id: (Array with: self nameId). |
|
325 |
outputStream reset. |
|
326 |
matchActions := nil. |
|
327 |
returnMatchBlock value: token |
|
328 |
! ! |
|
329 |
||
330 |
!StScanner class methodsFor:'documentation'! |
|
331 |
||
332 |
version |
|
25
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
333 |
^ '$Id$' |
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
334 |
! |
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
335 |
|
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
336 |
version_SVN |
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
337 |
^ '$Id:: $' |
1 | 338 |
! ! |
25
5a6921729520
UI improvements: added menu items to show FIRST() and LAST() sets for non-terminal symbols.
vranyj1
parents:
1
diff
changeset
|
339 |