// 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,
buildSyntaxTree(leftNode, contentSpec),
new CMUniOp( XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE,
buildSyntaxTree(leftNode, contentSpec) ));
} else {
throw new RuntimeException("ImplementationMessages.VAL_CST");