2 |
2 |
3 "{ NameSpace: Smalltalk }" |
3 "{ NameSpace: Smalltalk }" |
4 |
4 |
5 PPCScanner subclass:#FooScanner |
5 PPCScanner subclass:#FooScanner |
6 instanceVariableNames:'' |
6 instanceVariableNames:'' |
7 classVariableNames:'' |
7 classVariableNames:'MaxSymbolNumber Tokens' |
8 poolDictionaries:'' |
8 poolDictionaries:'' |
9 category:'PetitCompiler-Scanner' |
9 category:'PetitCompiler-Scanner' |
10 ! |
10 ! |
11 |
11 |
12 !FooScanner methodsFor:'as yet unclassified'! |
12 !FooScanner class methodsFor:'as yet unclassified'! |
|
13 |
|
14 initialize |
|
15 super initialize. |
|
16 |
|
17 MaxSymbolNumber := 3. |
|
18 Tokens := #(#A1 #A2 #B). |
|
19 ! ! |
|
20 |
|
21 !FooScanner methodsFor:'distinct'! |
13 |
22 |
14 nextTokenA |
23 nextTokenA |
15 "a" |
24 "a" |
|
25 self resetDistinct. |
|
26 |
16 self step. |
27 self step. |
17 self peek == $a ifFalse: [ ^ self return ]. |
28 self peek == $a ifFalse: [ ^ self return ]. |
18 |
29 |
19 self recordMatch: #a. |
30 self recordDistinctMatch: #a. |
20 |
31 |
21 ^ self return |
32 ^ self returnDistinct |
22 ! |
33 ! |
23 |
34 |
24 nextTokenAAorA |
35 nextTokenAAorA |
25 "aa / a" |
36 "aa / a" |
26 self step. |
37 self resetDistinct. |
27 (self peek == $a) ifFalse: [ ^ self return ]. |
38 |
28 self recordMatch: #a priority: -1. |
39 self step. |
29 |
40 (self peek == $a) ifFalse: [ ^ self returnDistinct ]. |
30 self step. |
41 self recordDistinctMatch: #a. |
31 (self peek == $a) ifFalse: [ ^ self return ]. |
42 |
32 self recordMatch: #aa priority: 0. |
43 self step. |
33 |
44 (self peek == $a) ifFalse: [ ^ self returnDistinct ]. |
34 ^ self return. |
45 self recordDistinctMatch: #aa. |
|
46 |
|
47 ^ self returnDistinct. |
35 ! |
48 ! |
36 |
49 |
37 nextTokenAAplusA |
50 nextTokenAAplusA |
38 "(aa)+a" |
51 "(aa)+a" |
39 self step. |
52 self resetDistinct. |
40 self peek == $a ifFalse: [ ^ self return ]. |
53 |
41 |
54 self step. |
42 self step. |
55 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
43 self peek == $a ifFalse: [ ^ self return. ]. |
56 |
44 |
57 self step. |
45 [ |
58 self peek == $a ifFalse: [ ^ self returnDistinct. ]. |
46 self step. |
59 |
47 self peek == $a ifFalse: [ ^ self returnPriority: 0 ]. |
60 [ |
48 self recordMatch: #AAplusA priority: -1. |
61 self recordDistinctMatch: nil. |
49 |
62 |
50 self step. |
63 self step. |
51 self peek == $a. |
64 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
52 ] whileTrue. |
65 self recordDistinctMatch: #AAplusA. |
53 |
66 |
54 ^ self returnPriority: -1 |
67 self step. |
|
68 self peek == $a. |
|
69 ] whileTrue. |
|
70 |
|
71 ^ self returnDistinct |
55 ! |
72 ! |
56 |
73 |
57 nextTokenAAstarA |
74 nextTokenAAstarA |
58 "(aa)*a" |
75 "(aa)*a" |
59 self step. |
76 self resetDistinct. |
60 self peek == $a ifFalse: [ ^ self return ]. |
77 |
61 |
78 self step. |
62 [ |
79 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
63 self recordMatch: #AAstarA priority: -1. |
80 |
64 |
81 [ |
65 self step. |
82 self recordDistinctMatch: #AAstarA. |
66 self peek == $a ifFalse: [ ^ self returnPriority: -1 ]. |
83 |
67 self step. |
84 self step. |
68 |
85 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
|
86 self recordDistinctMatch: nil. |
|
87 |
|
88 self step. |
69 self peek == $a |
89 self peek == $a |
70 ] whileTrue. |
90 ] whileTrue. |
71 |
91 |
72 ^ self returnPriority: 0 |
92 ^ self returnDistinct |
73 ! |
|
74 |
|
75 nextTokenAB |
|
76 "ab" |
|
77 self step. |
|
78 self peek == $a ifFalse: [ ^ self return ]. |
|
79 |
|
80 self step. |
|
81 self peek == $b ifFalse: [ ^ self return ]. |
|
82 self recordMatch: #b. |
|
83 |
|
84 ^ self return. |
|
85 ! |
93 ! |
86 |
94 |
87 nextTokenABorBC |
95 nextTokenABorBC |
88 "a" |
96 "a" |
89 self step. |
97 self resetDistinct. |
90 (self peek == $a) ifTrue: [ |
98 |
91 |
99 self step. |
92 self step. |
100 (self peek == $a) ifTrue: [ |
93 self peek == $b ifFalse: [ ^ self return ]. |
101 |
94 self recordMatch: #ab. |
102 self step. |
95 |
103 self peek == $b ifFalse: [ ^ self returnDistinct ]. |
96 ^ self return |
104 self recordDistinctMatch: #ab. |
|
105 |
|
106 ^ self returnDistinct |
97 ]. |
107 ]. |
98 |
108 |
99 (self peek == $b) ifTrue: [ |
109 (self peek == $b) ifTrue: [ |
100 self step. |
110 self step. |
101 self peek == $c ifFalse: [ ^ self return ]. |
111 self peek == $c ifFalse: [ ^ self returnDistinct ]. |
102 self recordMatch: #bc. |
112 self recordDistinctMatch: #bc. |
103 |
113 |
104 ^ self return |
114 ^ self returnDistinct |
105 ]. |
115 ]. |
106 |
116 |
107 ^ self return |
117 ^ self returnDistinct |
108 ! |
118 ! |
109 |
119 |
110 nextTokenABstarA |
120 nextTokenABstarA |
111 "(ab)*a" |
121 "(ab)*a" |
112 self step. |
122 self resetDistinct. |
113 self peek == $a ifFalse: [ ^ self return ]. |
123 |
114 |
124 self step. |
115 [ |
125 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
116 self recordMatch: #ABstarA priority: -1. |
126 |
|
127 [ |
|
128 self recordDistinctMatch: #ABstarA. |
117 |
129 |
118 self step. |
130 self step. |
119 self peek == $b ifFalse: [ ^ self returnPriority: -1 ]. |
131 self peek == $b ifFalse: [ ^ self returnDistinct ]. |
120 |
132 self recordDistinctMatch: nil. |
121 self step. |
133 |
122 self peek == $a. |
134 self step. |
123 ] whileTrue. |
135 self peek == $a. |
124 |
136 ] whileTrue. |
125 ^ self returnPriority: 0 |
137 |
|
138 ^ self returnDistinct |
126 ! |
139 ! |
127 |
140 |
128 nextTokenA_Bstar_A |
141 nextTokenA_Bstar_A |
129 "ab" |
142 "ab" |
130 self step. |
143 self resetDistinct. |
131 self peek == $a ifFalse: [ ^ self return ]. |
144 |
|
145 self step. |
|
146 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
132 |
147 |
133 [ |
148 [ |
134 self step. |
149 self step. |
135 self peek == $b. |
150 self peek == $b. |
136 ] whileTrue. |
151 ] whileTrue. |
137 |
152 |
138 |
153 |
139 self peek == $a ifFalse: [ ^ self return ]. |
154 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
140 self recordMatch: #A_Bstar_A. |
155 self recordDistinctMatch: #A_Bstar_A. |
141 |
156 |
142 ^ self return. |
157 ^ self returnDistinct. |
143 ! |
158 ! |
144 |
159 |
145 nextTokenAorAA |
160 nextTokenAorAA |
146 "aa / a" |
161 "aa / a" |
147 self step. |
162 self resetDistinct. |
148 (self peek == $a) ifTrue: [ |
163 |
149 self recordMatch: #a priority: 0. |
164 self step. |
150 ^ self return |
165 (self peek == $a) ifTrue: [ |
151 ]. |
166 self recordDistinctMatch: #a. |
152 |
167 ^ self returnDistinct |
153 self step. |
168 ]. |
154 (self peek == $a) ifTrue: [ |
169 |
155 self recordMatch: #aa priority: -1. |
170 self step. |
156 ^ self return |
171 (self peek == $a) ifTrue: [ |
|
172 self recordDistinctMatch: #aa. |
|
173 ^ self returnDistinct |
157 ]. |
174 ]. |
158 ! |
175 ! |
159 |
176 |
160 nextTokenAorB |
177 nextTokenAorB |
161 "a" |
178 "a" |
162 self step. |
179 self resetDistinct. |
163 (self peek == $a) ifTrue: [ |
180 |
164 self recordMatch: #a. |
181 self step. |
165 ^ self return |
182 (self peek == $a) ifTrue: [ |
|
183 self recordDistinctMatch: #a. |
|
184 ^ self returnDistinct |
166 ]. |
185 ]. |
167 (self peek == $b) ifTrue: [ |
186 (self peek == $b) ifTrue: [ |
168 self recordMatch: #b. |
187 self recordDistinctMatch: #b. |
169 ^ self return |
188 ^ self returnDistinct |
170 ]. |
189 ]. |
171 |
190 |
172 ^ self return |
191 ^ self returnDistinct |
173 ! |
192 ! |
174 |
193 |
175 nextTokenAstarA |
194 nextTokenAstarA |
176 "a*a" |
195 "a*a" |
177 [ |
196 [ |
178 self step. |
197 self step. |
179 self peek == $a. |
198 self peek == $a. |
180 ] whileTrue. |
199 ] whileTrue. |
181 |
200 |
182 self peek == $a ifFalse: [ ^ self return ]. |
201 self peek == $a ifFalse: [ ^ self returnDistinct ]. |
183 self recordMatch: #AstarA. |
202 self recordDistinctMatch: #AstarA. |
184 ^ self return |
203 ^ self returnDistinct |
185 ! |
204 ! |
186 |
205 |
187 nextTokenAstarB |
206 nextTokenAstarB |
188 "a*b" |
207 "a*b" |
189 [ |
208 self resetDistinct. |
190 self step. |
209 |
191 self peek == $a. |
210 [ |
192 ] whileTrue. |
211 self step. |
193 |
212 self peek == $a. |
194 self peek == $b ifFalse: [ ^ self return ]. |
213 ] whileTrue. |
195 self recordMatch: #AstarB. |
214 |
196 ^ self return |
215 self peek == $b ifFalse: [ ^ self returnDistinct ]. |
|
216 self recordDistinctMatch: #AstarB. |
|
217 ^ self returnDistinct |
|
218 ! ! |
|
219 |
|
220 !FooScanner methodsFor:'initialization'! |
|
221 |
|
222 initialize |
|
223 super initialize. |
|
224 ! ! |
|
225 |
|
226 !FooScanner methodsFor:'mutlivalue'! |
|
227 |
|
228 nextMultiTokenA |
|
229 "a|a" |
|
230 self reset. |
|
231 |
|
232 self step. |
|
233 self peek == $a ifFalse: [ ^ self ]. |
|
234 |
|
235 self recordMatch: 1. "A1 in matches" |
|
236 self recordMatch: 2. "A2 in matches" |
|
237 ! |
|
238 |
|
239 nextTokenAB |
|
240 "ab" |
|
241 self reset. |
|
242 |
|
243 self step. |
|
244 self peek == $a ifFalse: [ ^ self ]. |
|
245 |
|
246 self step. |
|
247 self peek == $b ifFalse: [ ^ self ]. |
|
248 self recordMatch: 3. "ID of #B" |
|
249 |
|
250 ^ self |
197 ! |
251 ! |
198 |
252 |
199 nextTokenAuorA |
253 nextTokenAuorA |
200 "a | a" |
254 "a | a" |
201 self step. |
255 self reset. |
202 (self peek == $a) ifTrue: [ |
256 |
203 self recordMatch: #a1. |
257 self step. |
204 self recordMatch: #a2. |
258 (self peek == $a) ifTrue: [ |
205 ^ self return |
259 self recordMatch: 1. |
206 ]. |
260 self recordMatch: 2. |
207 |
261 ^ self |
208 ^ self return |
262 ]. |
209 ! ! |
263 |
210 |
264 ^ self |
|
265 ! ! |
|
266 |
|
267 |
|
268 FooScanner initialize! |