001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017:
018: package org.apache.xerces.impl.xs.models;
019:
020: import org.apache.xerces.impl.dtd.models.CMNode;
021: import org.apache.xerces.impl.dtd.models.CMStateSet;
022: import org.apache.xerces.impl.xs.XSModelGroupImpl;
023:
024: /**
025: *
026: * Content model Bin-Op node.
027: *
028: * @xerces.internal
029: *
030: * @author Neil Graham, IBM
031: * @version $Id: XSCMBinOp.java 476309 2006-11-17 20:49:31Z mrglavas $
032: */
033: public class XSCMBinOp extends CMNode {
034: // -------------------------------------------------------------------
035: // Constructors
036: // -------------------------------------------------------------------
037: public XSCMBinOp(int type, CMNode leftNode, CMNode rightNode) {
038: super (type);
039:
040: // Insure that its one of the types we require
041: if ((type() != XSModelGroupImpl.MODELGROUP_CHOICE)
042: && (type() != XSModelGroupImpl.MODELGROUP_SEQUENCE)) {
043: throw new RuntimeException("ImplementationMessages.VAL_BST");
044: }
045:
046: // Store the nodes and init any data that needs it
047: fLeftChild = leftNode;
048: fRightChild = rightNode;
049: }
050:
051: // -------------------------------------------------------------------
052: // Package, final methods
053: // -------------------------------------------------------------------
054: final CMNode getLeft() {
055: return fLeftChild;
056: }
057:
058: final CMNode getRight() {
059: return fRightChild;
060: }
061:
062: // -------------------------------------------------------------------
063: // Package, inherited methods
064: // -------------------------------------------------------------------
065: public boolean isNullable() {
066: //
067: // If its an alternation, then if either child is nullable then
068: // this node is nullable. If its a concatenation, then both of
069: // them have to be nullable.
070: //
071: if (type() == XSModelGroupImpl.MODELGROUP_CHOICE)
072: return (fLeftChild.isNullable() || fRightChild.isNullable());
073: else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE)
074: return (fLeftChild.isNullable() && fRightChild.isNullable());
075: else
076: throw new RuntimeException("ImplementationMessages.VAL_BST");
077: }
078:
079: // -------------------------------------------------------------------
080: // Protected, inherited methods
081: // -------------------------------------------------------------------
082: protected void calcFirstPos(CMStateSet toSet) {
083: if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) {
084: // Its the the union of the first positions of our children.
085: toSet.setTo(fLeftChild.firstPos());
086: toSet.union(fRightChild.firstPos());
087: } else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) {
088: //
089: // If our left child is nullable, then its the union of our
090: // children's first positions. Else is our left child's first
091: // positions.
092: //
093: toSet.setTo(fLeftChild.firstPos());
094: if (fLeftChild.isNullable())
095: toSet.union(fRightChild.firstPos());
096: } else {
097: throw new RuntimeException("ImplementationMessages.VAL_BST");
098: }
099: }
100:
101: protected void calcLastPos(CMStateSet toSet) {
102: if (type() == XSModelGroupImpl.MODELGROUP_CHOICE) {
103: // Its the the union of the first positions of our children.
104: toSet.setTo(fLeftChild.lastPos());
105: toSet.union(fRightChild.lastPos());
106: } else if (type() == XSModelGroupImpl.MODELGROUP_SEQUENCE) {
107: //
108: // If our right child is nullable, then its the union of our
109: // children's last positions. Else is our right child's last
110: // positions.
111: //
112: toSet.setTo(fRightChild.lastPos());
113: if (fRightChild.isNullable())
114: toSet.union(fLeftChild.lastPos());
115: } else {
116: throw new RuntimeException("ImplementationMessages.VAL_BST");
117: }
118: }
119:
120: // -------------------------------------------------------------------
121: // Private data members
122: //
123: // fLeftChild
124: // fRightChild
125: // These are the references to the two nodes that are on either
126: // side of this binary operation.
127: // -------------------------------------------------------------------
128: private CMNode fLeftChild;
129: private CMNode fRightChild;
130: } // XSCMBinOp
|