// storing it. This makes the positions zero based since we
// store first and then increment.
//
fQName1.setValues(null, (String)contentSpec.value,
(String)contentSpec.value, (String)contentSpec.otherValue);
nodeRet = new CMLeaf(fQName1, fLeafCount++);
}
else {
//
// Its not a leaf, so we have to recurse its left and maybe right
// nodes. Save both values before we recurse and trash the node.
final int leftNode = ((int[])contentSpec.value)[0];
final int rightNode = ((int[])contentSpec.otherValue)[0];
if ((contentSpec.type == XMLContentSpec.CONTENTSPECNODE_CHOICE)
|| (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_SEQ)) {
//
// Recurse on both children, and return a binary op node
// with the two created sub nodes as its children. The node
// type is the same type as the source.
//
nodeRet = new CMBinOp( contentSpec.type, buildSyntaxTree(leftNode, contentSpec)
, buildSyntaxTree(rightNode, contentSpec));
} else if (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE) {
nodeRet = new CMUniOp( contentSpec.type, buildSyntaxTree(leftNode, contentSpec));
} else if (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ZERO_OR_ONE) {
// Convert to (x|epsilon)
String epsilon = "<<CMNODE_EPSILON>>";
epsilon.intern();
nodeRet = new CMBinOp( XMLContentSpec.CONTENTSPECNODE_CHOICE,
buildSyntaxTree(leftNode, contentSpec)
, new CMLeaf( new QName(null, epsilon, epsilon, null), fEpsilonIndex));
// REVISIT: Epsilon constants in DFAContentModel.
//, new CMLeaf( new QName(-1,-2,-2,-1), fEpsilonIndex));
} else if (contentSpec.type == XMLContentSpec.CONTENTSPECNODE_ONE_OR_MORE) {
// Convert to (x,x*)
nodeRet = new CMBinOp( XMLContentSpec.CONTENTSPECNODE_SEQ,