xpath/trunk/XMLv2__XPathExprTreeNode.st
changeset 0 5057afe1ec87
equal deleted inserted replaced
-1:000000000000 0:5057afe1ec87
       
     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 ! !