|
1 "{ Package: 'stx:goodies/xmlsuite/xpath' }" |
|
2 |
|
3 "{ NameSpace: XMLv2 }" |
|
4 |
|
5 Object subclass:#XPathExprTreeNode |
|
6 instanceVariableNames:'id subnodes synthetizedValue' |
|
7 classVariableNames:'rules' |
|
8 poolDictionaries:'' |
|
9 category:'XML Suite-XPath' |
|
10 ! |
|
11 |
|
12 |
|
13 !XPathExprTreeNode class methodsFor:'accessing'! |
|
14 |
|
15 rules |
|
16 ^rules. |
|
17 ! ! |
|
18 |
|
19 !XPathExprTreeNode class methodsFor:'defaults'! |
|
20 |
|
21 defaultSubnodes |
|
22 "default value for the 'subnodes' instance variable (automatically generated)" |
|
23 |
|
24 self halt:'unfinished code'. |
|
25 ^ nil. |
|
26 ! ! |
|
27 |
|
28 !XPathExprTreeNode class methodsFor:'misc'! |
|
29 |
|
30 loadRules |
|
31 rules := Dictionary new. |
|
32 |
|
33 "OK [1] LocationPath ::= RelativeLocationPath |
|
34 | AbsoluteLocationPath" |
|
35 rules at:#rule_1_1 |
|
36 put:[:node :derivedValue | |
|
37 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
38 node synthetizedValue |
|
39 ]. |
|
40 rules at:#rule_1_2 |
|
41 put:[:node :derivedValue | |
|
42 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
43 node synthetizedValue |
|
44 ]. |
|
45 |
|
46 "OK [2] AbsoluteLocationPath : |
|
47 / RelativeLocationPath 'RLP' |
|
48 | / |
|
49 | AbbreviatedAbsoluteLocationPath 'AALP'" |
|
50 rules at:#rule_2_1 |
|
51 put:[:node :derivedValue | |
|
52 node synthetizedValue:(node evaluateSubnodeAt:2 withDerivedValue:derivedValue). |
|
53 node synthetizedValue absolute:true. |
|
54 node synthetizedValue. |
|
55 ]. |
|
56 rules at:#rule_2_2 |
|
57 put:[:node :derivedValue | |
|
58 derivedValue absolute:true. |
|
59 derivedValue steps add:(XPathLocationStep new axis:(XPathAxisSelf new); |
|
60 nodeTest:(XPathNodeTypeTest new)). |
|
61 derivedValue. |
|
62 ]. |
|
63 rules at:#rule_2_3 |
|
64 put:[:node :derivedValue | |
|
65 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
66 node synthetizedValue absolute:true. |
|
67 node synthetizedValue. |
|
68 ]. |
|
69 |
|
70 "OK [3] RelativeLocationPath ::= Step |
|
71 | RelativeLocationPath '/' Step |
|
72 | AbbreviatedRelativeLocationPath" |
|
73 rules at:#rule_3_1 |
|
74 put:[:node :derivedValue | |
|
75 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
76 node synthetizedValue |
|
77 ]. |
|
78 |
|
79 rules at:#rule_3_2 |
|
80 put:[:node :derivedValue | |
|
81 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
82 node evaluateSubnodeAt:3 withDerivedValue:(node synthetizedValue). |
|
83 node synthetizedValue. |
|
84 ]. |
|
85 |
|
86 rules at:#rule_3_3 |
|
87 put:[:node :derivedValue | |
|
88 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
89 node synthetizedValue. |
|
90 ]. |
|
91 |
|
92 "OK [4] Step ::= AxisSpecifier NodeTest Predicate* |
|
93 | . |
|
94 | .. |
|
95 | <NCName> 'NCN' Predicate* 'PR'" |
|
96 rules at:#rule_4_1 |
|
97 put:[:node :derivedValue | |
|
98 | step | |
|
99 step := XPathLocationStep new. |
|
100 step axis: (node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
101 step nodeTest: (node evaluateSubnodeAt:2 withDerivedValue:derivedValue). |
|
102 (node subnodes at:3) do:[:subnode | |
|
103 step predicates add:(subnode evaluate) |
|
104 ]. |
|
105 derivedValue steps add: step. |
|
106 derivedValue. |
|
107 ]. |
|
108 rules at:#rule_4_2 |
|
109 put:[:node :derivedValue | |
|
110 derivedValue steps add:(XPathLocationStep new axis:(XPathAxisSelf new); |
|
111 nodeTest:(XPathNodeTypeTest new)). |
|
112 node synthetizedValue:derivedValue. |
|
113 derivedValue. |
|
114 ]. |
|
115 rules at:#rule_4_3 |
|
116 put:[:node :derivedValue | |
|
117 derivedValue steps add:(XPathLocationStep new axis:(XPathAxisParent new); |
|
118 nodeTest:(XPathNodeTypeTest new)). |
|
119 node synthetizedValue:derivedValue. |
|
120 derivedValue. |
|
121 ]. |
|
122 |
|
123 rules at:#rule_4_4 |
|
124 put:[:node :derivedValue | |
|
125 | step | |
|
126 step := XPathLocationStep new. |
|
127 step axis: (XPathAxisChild new). |
|
128 step nodeTest: (XPathNameTest new name:((node subnodes at:1) synthetizedValue); namespace:#all). |
|
129 (node subnodes at:2) do:[:subnode | |
|
130 step predicates add:(subnode evaluate) |
|
131 ]. |
|
132 derivedValue steps add: step. |
|
133 derivedValue. |
|
134 ]. |
|
135 |
|
136 |
|
137 "OK [5] AxisSpecifier ::= AxisName '::' |
|
138 | '@'" |
|
139 rules at:#rule_5_1 |
|
140 put:[ :node :derivedValue | |
|
141 XPathAxis getAxisOfType:(node synthetizedValue). |
|
142 ]. |
|
143 rules at:#rule_5_2 |
|
144 put:[ :node :derivedValue | |
|
145 XPathAxis getAxisOfType:(node synthetizedValue). |
|
146 ]. |
|
147 |
|
148 "[6] NodeTest ::= NameTest |
|
149 | NodeType '(' ')' |
|
150 | 'processing-instruction' '(' Literal ')'" |
|
151 rules at:#rule_6_1 |
|
152 put:[ :node :derivedValue | |
|
153 node evaluateSubnodeAt:1 |
|
154 ]. |
|
155 |
|
156 "OK [8] AbbreviatedAbsoluteLocationPath : // RelativeLocationPath 'RLP'" |
|
157 rules at:#rule_8_1 |
|
158 put:[:node :derivedValue | |
|
159 derivedValue steps add:(XPathLocationStep new axis:(XPathAxisDescendant new); |
|
160 nodeTest:(XPathNodeTypeTest new)). |
|
161 node evaluateSubnodeAt:2 withDerivedValue:derivedValue |
|
162 ]. |
|
163 |
|
164 "OK [9] AbbreviatedRelativeLocationPath : |
|
165 RelativeLocationPath 'RLP' // Step 'Step'" |
|
166 rules at:#rule_9_1 |
|
167 put:[:node :derivedValue | |
|
168 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
169 node synthetizedValue steps add:(XPathLocationStep new axis:(XPathAxisDescendantOrSelf new); |
|
170 nodeTest:(XPathNodeTypeTest new)). |
|
171 node evaluateSubnodeAt:3 withDerivedValue:(node synthetizedValue). |
|
172 node synthetizedValue. |
|
173 ]. |
|
174 |
|
175 "[24] NameTest : * |
|
176 | <NCName> 'NCN' : * |
|
177 | <NCName> : <NCName> |
|
178 | <NCName> 'NCN'" |
|
179 rules at:#rule_24_1 |
|
180 put:[ :node :derivedValue | |
|
181 XPathNameTest new namespace:#all; name:#all |
|
182 ]. |
|
183 |
|
184 rules at:#rule_24_4 |
|
185 put:[ :node :derivedValue | |
|
186 XPathNameTest new namespace:#all; name:(node synthetizedValue) |
|
187 ]. |
|
188 ! |
|
189 |
|
190 loadRules_old |
|
191 rules := Dictionary new. |
|
192 |
|
193 "[1] LocationPath ::= RelativeLocationPath |
|
194 | AbsoluteLocationPath" |
|
195 rules at:#rule_1_1 |
|
196 put:[:node :derivedValue | |
|
197 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
198 node synthetizedValue |
|
199 ]. |
|
200 rules at:#rule_1_2 |
|
201 put:[:node :derivedValue | |
|
202 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
203 node synthetizedValue |
|
204 ]. |
|
205 |
|
206 "[3] RelativeLocationPath ::= Step |
|
207 | RelativeLocationPath '/' Step |
|
208 | AbbreviatedRelativeLocationPath" |
|
209 rules at:#rule_3_1 |
|
210 put:[:node :derivedValue | |
|
211 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
212 node synthetizedValue |
|
213 ]. |
|
214 |
|
215 rules at:#rule_3_2 |
|
216 put:[:node :derivedValue | |
|
217 node synthetizedValue:(node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
218 node evaluateSubnodeAt:3 withDerivedValue:(node synthetizedValue). |
|
219 node synthetizedValue. |
|
220 ]. |
|
221 |
|
222 "[4] Step ::= AxisSpecifier NodeTest Predicate* |
|
223 | AbbreviatedStep" |
|
224 rules at:#rule_4_1 |
|
225 put:[:node :derivedValue | |
|
226 | step | |
|
227 step := XPathLocationStep new. |
|
228 step axis: (node evaluateSubnodeAt:1 withDerivedValue:derivedValue). |
|
229 step nodeTest: (node evaluateSubnodeAt:2 withDerivedValue:derivedValue). |
|
230 (node subnodes at:3) do:[:subnode | |
|
231 step predicates add:(subnode evaluate) |
|
232 ]. |
|
233 derivedValue steps add: step. |
|
234 derivedValue. |
|
235 ]. |
|
236 |
|
237 "[5] AxisSpecifier ::= AxisName '::' |
|
238 | AbbreviatedAxisSpecifier" |
|
239 rules at:#rule_5_1 |
|
240 put:[ :node :derivedValue | |
|
241 XPathAxis getAxisOfType:(node synthetizedValue). |
|
242 ]. |
|
243 |
|
244 "[6] NodeTest ::= NameTest |
|
245 | NodeType '(' ')' |
|
246 | 'processing-instruction' '(' Literal ')'" |
|
247 rules at:#rule_6_1 |
|
248 put:[ :node :derivedValue | |
|
249 node evaluateSubnodeAt:1 |
|
250 ]. |
|
251 |
|
252 "[8] Predicate ::= '[' PredicateExpr ']'" |
|
253 rules at:#rule_8_1 |
|
254 put:[ :node :derivedValue | |
|
255 node evaluateSubnodeAt:1 withDerivedValue:(XPathPredicate new) |
|
256 ]. |
|
257 |
|
258 "[9] PredicateExpr ::= Expr" |
|
259 rules at:#rule_9_1 |
|
260 put:[ :node :derivedValue | |
|
261 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
262 ]. |
|
263 |
|
264 "[14] Expr ::= OrExpr" |
|
265 rules at:#rule_14_1 |
|
266 put:[ :node :derivedValue | |
|
267 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
268 ]. |
|
269 |
|
270 "[15] PrimaryExpr ::= VariableReference |
|
271 | '(' Expr ')' |
|
272 | Literal |
|
273 | Number |
|
274 | FunctionCall" |
|
275 rules at:#rule_15_4 |
|
276 put:[ :node :derivedValue | |
|
277 XPathPredicate::PredicateNumberNode new number: (node evaluateSubnodeAt:1) |
|
278 ]. |
|
279 |
|
280 "[18] UnionExpr ::= PathExpr |
|
281 | UnionExpr '|' PathExpr" |
|
282 rules at:#rule_18_1 |
|
283 put:[ :node :derivedValue | |
|
284 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
285 ]. |
|
286 |
|
287 "[19] PathExpr ::= LocationPath |
|
288 | FilterExpr |
|
289 | FilterExpr '/' RelativeLocationPath |
|
290 | FilterExpr '//' RelativeLocationPath" |
|
291 rules at:#rule_19_2 |
|
292 put:[ :node :derivedValue | |
|
293 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
294 ]. |
|
295 |
|
296 "[20] FilterExpr ::= PrimaryExpr |
|
297 | FilterExpr Predicate" |
|
298 rules at:#rule_20_1 |
|
299 put:[ :node :derivedValue | |
|
300 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
301 ]. |
|
302 |
|
303 "[21] OrExpr ::= AndExpr |
|
304 | OrExpr 'or' AndExpr" |
|
305 rules at:#rule_21_1 |
|
306 put:[ :node :derivedValue | |
|
307 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
308 ]. |
|
309 |
|
310 "[22] AndExpr ::= EqualityExpr |
|
311 | AndExpr 'and' EqualityExpr" |
|
312 rules at:#rule_22_1 |
|
313 put:[ :node :derivedValue | |
|
314 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
315 ]. |
|
316 |
|
317 "[23] EqualityExpr ::= RelationalExpr |
|
318 | EqualityExpr '=' RelationalExpr |
|
319 | EqualityExpr '!!=' RelationalExpr" |
|
320 rules at:#rule_23_1 |
|
321 put:[ :node :derivedValue | |
|
322 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
323 ]. |
|
324 |
|
325 "[24] RelationalExpr ::= AdditiveExpr |
|
326 | RelationalExpr '<' AdditiveExpr |
|
327 | RelationalExpr '>' AdditiveExpr |
|
328 | RelationalExpr '<=' AdditiveExpr |
|
329 | RelationalExpr '>=' AdditiveExpr" |
|
330 rules at:#rule_24_1_x |
|
331 put:[ :node :derivedValue | |
|
332 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
333 ]. |
|
334 |
|
335 "[25] AdditiveExpr ::= MultiplicativeExpr |
|
336 | AdditiveExpr '+' MultiplicativeExpr |
|
337 | AdditiveExpr '-' MultiplicativeExpr" |
|
338 rules at:#rule_25_1 |
|
339 put:[ :node :derivedValue | |
|
340 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
341 ]. |
|
342 |
|
343 "[26] MultiplicativeExpr ::= UnaryExpr |
|
344 | MultiplicativeExpr MultiplyOperator UnaryExpr |
|
345 | MultiplicativeExpr 'div' UnaryExpr |
|
346 | MultiplicativeExpr 'mod' UnaryExpr" |
|
347 rules at:#rule_26_1 |
|
348 put:[ :node :derivedValue | |
|
349 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
350 ]. |
|
351 |
|
352 "[27] UnaryExpr ::= UnionExpr |
|
353 | '-' UnaryExpr" |
|
354 rules at:#rule_27_1 |
|
355 put:[ :node :derivedValue | |
|
356 node evaluateSubnodeAt:1 withDerivedValue:derivedValue |
|
357 ]. |
|
358 |
|
359 "[30] Number ::= Digits ('.' Digits?)? |
|
360 | '.' Digits" |
|
361 rules at:#rules_30_1 |
|
362 put:[ :node :derivedValue | |
|
363 1 |
|
364 ]. |
|
365 |
|
366 "[24] NameTest : * |
|
367 | <NCName> 'NCN' : * |
|
368 | <NCName> : <NCName> |
|
369 | <NCName> 'NCN'" |
|
370 rules at:#rule_24_1 |
|
371 put:[ :node :derivedValue | |
|
372 XPathNameTest new namespace:#all; name:#all |
|
373 ]. |
|
374 |
|
375 rules at:#rule_24_4 |
|
376 put:[ :node :derivedValue | |
|
377 XPathNameTest new namespace:#all; name:(node synthetizedValue) |
|
378 ]. |
|
379 ! ! |
|
380 |
|
381 !XPathExprTreeNode methodsFor:'accessing'! |
|
382 |
|
383 getParsedString |
|
384 |pString| |
|
385 |
|
386 subnodes notNil ifFalse:[ |
|
387 ^ self synthetizedValue |
|
388 ]. |
|
389 pString := String new. |
|
390 (subnodes) do:[:node | |
|
391 Exception |
|
392 handle:[:e | |
|
393 "assuming OrderedCollection !!" |
|
394 ((node class) asString = 'OrderedCollection') ifTrue:[ |
|
395 (node) do:[:p | |
|
396 pString := pString , p getParsedString. |
|
397 ] |
|
398 ] |
|
399 ] |
|
400 do:[ pString := pString , node getParsedString. ] |
|
401 ]. |
|
402 ^ pString. |
|
403 ! |
|
404 |
|
405 id |
|
406 id isNil ifTrue:[ |
|
407 id := String new. |
|
408 ]. |
|
409 ^ id |
|
410 ! |
|
411 |
|
412 id: anIdSymbol |
|
413 id := anIdSymbol |
|
414 ! |
|
415 |
|
416 subnodes |
|
417 subnodes isNil ifTrue:[ |
|
418 subnodes := List new. |
|
419 ]. |
|
420 ^ subnodes |
|
421 ! |
|
422 |
|
423 synthetizedValue |
|
424 ^ synthetizedValue |
|
425 ! |
|
426 |
|
427 synthetizedValue:something |
|
428 synthetizedValue := something. |
|
429 ! ! |
|
430 |
|
431 !XPathExprTreeNode methodsFor:'printing & storing'! |
|
432 |
|
433 printOn:aStream |
|
434 synthetizedValue isNil ifFalse:[ |
|
435 aStream nextPutAll:(synthetizedValue asString) |
|
436 ] ifTrue:[ |
|
437 aStream nextPutAll:(id asString) |
|
438 ]. |
|
439 ! ! |
|
440 |
|
441 !XPathExprTreeNode methodsFor:'private'! |
|
442 |
|
443 evaluateSubnodeAt:aSubnodePosition |
|
444 ^ (subnodes at:aSubnodePosition) evaluateWithDerivedValue:nil. |
|
445 ! |
|
446 |
|
447 evaluateSubnodeAt:aSubnodePosition withDerivedValue:aDerivedValue |
|
448 ^ (subnodes at:aSubnodePosition) evaluateWithDerivedValue:aDerivedValue. |
|
449 ! ! |
|
450 |
|
451 !XPathExprTreeNode methodsFor:'processing'! |
|
452 |
|
453 evaluate |
|
454 ^ (self class rules at:id) value:self value:nil. |
|
455 ! |
|
456 |
|
457 evaluateWithDerivedValue:derivedValue |
|
458 XPathCoverageMonitor addId:id. |
|
459 ^ (self class rules at:id) value:self value:derivedValue. |
|
460 ! ! |
|
461 |
|
462 !XPathExprTreeNode methodsFor:'tree creation'! |
|
463 |
|
464 add:subnode ruleId:ruleId |
|
465 "check nil" |
|
466 |
|
467 self subnodes. |
|
468 subnodes add:subnode. |
|
469 self id:ruleId. |
|
470 ! |
|
471 |
|
472 addToSubnodes:node |
|
473 subnodes add:node. |
|
474 ! ! |
|
475 |
|
476 !XPathExprTreeNode class methodsFor:'documentation'! |
|
477 |
|
478 version |
|
479 ^ '$Header: /opt/data/cvs/stx/goodies/xmlsuite/xpath/XMLv2__XPathExprTreeNode.st,v 1.1 2006-09-28 16:15:38 vranyj1 Exp $' |
|
480 ! ! |