Class CombinedChildContentExpCreator

java.lang.Object
com.sun.msv.verifier.regexp.CombinedChildContentExpCreator
All Implemented Interfaces:
ExpressionVisitorVoid

public class CombinedChildContentExpCreator extends Object implements ExpressionVisitorVoid
creates "combined child content expression" and gathers "elements of concern" and its "attribute-pruned" content model. Intuitively, "combined child content expression" is a set of content models of "elements of concern", which is appropriately combined to express dependency between elements. "Elements of concern" are ElementExps that are possibly applicable to the next element. These gathered element declarations are then tested against next XML element. "Attribute-pruned" content model is a content model after consuming AttributeTokens and removing unused AttributeExp nodes.

For example, when the current expression is

    <!-- javadoc escape -->
   <choice>
     <concur>
       <element> ..(A).. </element>
       <group>
         <element> ..(B).. </element>
         ...
       </group>
     </concur>
     <group>
       <element> ..(C).. </element>
       ....
     </group>
   </choice>
 
then the combined child expression is

   <choice>
     <concur>
       ..(A').. 
       ..(B').. 
     </concur>
     ..(C').. 
   </choice>
 
and elements of concern and its attribute-pruned content models are <element> ..(A).. </element> -&gt; ..(A').. <element> ..(B).. </element> -&gt; ..(B').. <element> ..(C).. </element> -&gt; ..(C').. (A'),(B'), and (C') are attribute-pruned content models of (A),(B), and (C) respectively. Note that combined child pattern contains only <choice> and <concur> as its grue (of course, except ..(A').. , ..(B').. , and ..(C').. ). This function object also calculates "continuation", which is the residual expression after eating elements of concern. For example, say the expression is "(A|(B,C))?,D". When EoC is B, then the continuation will be C,D. When EoC is A, then the continuation will be D. When EoC is D, then the continuation will be epsilon. When there are multiple EoC, (say A and B), then the continuation will be meaningless (because it depends on which EoC will be accepted), and thus won't be used. However, the implementator must be aware that it is possible for a binary operator to have EoC on both branch and EoC is still unique. The following expression is an example. (A|B)*,C?,(A|B)* when A is EoC, SequenceExp of (A|B)* and C?,(A|B)* has EoC on both branch.
  • Field Details

    • pool

      protected final ExpressionPool pool
    • tagInfo

      private StartTagInfo tagInfo
    • result

      private ElementExp[] result
      matched elements. the buffer is usually bigger than numElements, but only first numElements items are valid result.
    • numElements

      private int numElements
    • checkTagName

      private boolean checkTagName
    • content

      private Expression content
    • continuation

      private Expression continuation
    • foundConcur

      private boolean foundConcur
      a flag that indicates that we have 'concur' element to combine elements of concern. If 'concur' is used, we have to keep track of combined child content expression to detect errors. If 'concur' is not used, then keeping track of all primitive child content expressions are enough to detect errors.
  • Constructor Details

    • CombinedChildContentExpCreator

      protected CombinedChildContentExpCreator(ExpressionPool pool)
  • Method Details