public CMNode getCMBinOpNode(int type, CMNode leftNode, CMNode rightNode) { nodeCountCheck() ; return new XSCMBinOp(type, leftNode, rightNode) ; }
public XSCMBinOp(int type, CMNode leftNode, CMNode rightNode) { super(type); // Insure that its one of the types we require if ((type() != XSModelGroupImpl.MODELGROUP_CHOICE) && (type() != XSModelGroupImpl.MODELGROUP_SEQUENCE)) { throw new RuntimeException("ImplementationMessages.VAL_BST"); } // Store the nodes and init any data that needs it fLeftChild = leftNode; fRightChild = rightNode; }
calcFollowList(((XSCMBinOp)nodeCur).getLeft()); calcFollowList(((XSCMBinOp)nodeCur).getRight()); calcFollowList(((XSCMBinOp)nodeCur).getLeft()); calcFollowList(((XSCMBinOp)nodeCur).getRight()); final CMStateSet last = ((XSCMBinOp)nodeCur).getLeft().lastPos(); final CMStateSet first = ((XSCMBinOp)nodeCur).getRight().firstPos();
private CMNode copyNode(CMNode node) { int type = node.type(); // for choice or sequence, copy the two subtrees, and combine them if (type == XSModelGroupImpl.MODELGROUP_CHOICE || type == XSModelGroupImpl.MODELGROUP_SEQUENCE) { XSCMBinOp bin = (XSCMBinOp)node; node = fNodeFactory.getCMBinOpNode(type, copyNode(bin.getLeft()), copyNode(bin.getRight())); } // for ?+*, copy the subtree, and put it in a new ?+* node else if (type == XSParticleDecl.PARTICLE_ZERO_OR_MORE || type == XSParticleDecl.PARTICLE_ONE_OR_MORE || type == XSParticleDecl.PARTICLE_ZERO_OR_ONE) { XSCMUniOp uni = (XSCMUniOp)node; node = fNodeFactory.getCMUniOpNode(type, copyNode(uni.getChild())); } // for element/wildcard (leaf), make a new leaf node, // with a distinct position else if (type == XSParticleDecl.PARTICLE_ELEMENT || type == XSParticleDecl.PARTICLE_WILDCARD) { XSCMLeaf leaf = (XSCMLeaf)node; node = fNodeFactory.getCMLeafNode(leaf.type(), leaf.getLeaf(), leaf.getParticleId(), fLeafCount++); } return node; }
fHeadNode = new XSCMBinOp( XSModelGroupImpl.MODELGROUP_SEQUENCE, syntaxTree,
public boolean isNullable() { // // If its an alternation, then if either child is nullable then // this node is nullable. If its a concatenation, then both of // them have to be nullable. // if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) return (fLeftChild.isNullable() || fRightChild.isNullable()); else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) return (fLeftChild.isNullable() && fRightChild.isNullable()); else throw new RuntimeException("ImplementationMessages.VAL_BST"); }
protected void calcFirstPos(CMStateSet toSet) { if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) { // Its the the union of the first positions of our children. toSet.setTo(fLeftChild.firstPos()); toSet.union(fRightChild.firstPos()); } else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) { // // If our left child is nullable, then its the union of our // children's first positions. Else is our left child's first // positions. // toSet.setTo(fLeftChild.firstPos()); if (fLeftChild.isNullable()) toSet.union(fRightChild.firstPos()); } else { throw new RuntimeException("ImplementationMessages.VAL_BST"); } }
protected void calcLastPos(CMStateSet toSet) { if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) { // Its the the union of the first positions of our children. toSet.setTo(fLeftChild.lastPos()); toSet.union(fRightChild.lastPos()); } else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) { // // If our right child is nullable, then its the union of our // children's last positions. Else is our right child's last // positions. // toSet.setTo(fRightChild.lastPos()); if (fRightChild.isNullable()) toSet.union(fLeftChild.lastPos()); } else { throw new RuntimeException("ImplementationMessages.VAL_BST"); } }