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:
023: /**
024: * Content model leaf node.
025: *
026: * @xerces.internal
027: *
028: * @author Neil Graham, IBM
029: * @version $Id: XSCMLeaf.java 572112 2007-09-02 19:11:51Z mrglavas $
030: */
031: public class XSCMLeaf extends CMNode {
032:
033: //
034: // Data
035: //
036:
037: /** This is the leaf: element decl or wildcard decl. */
038: private final Object fLeaf;
039:
040: /**
041: * Identify the particle: for UPA checking
042: */
043: private int fParticleId = -1;
044:
045: /**
046: * Part of the algorithm to convert a regex directly to a DFA
047: * numbers each leaf sequentially. If its -1, that means its an
048: * epsilon node. Zero and greater are non-epsilon positions.
049: */
050: private int fPosition = -1;
051:
052: //
053: // Constructors
054: //
055:
056: /** Constructs a content model leaf. */
057: public XSCMLeaf(int type, Object leaf, int id, int position) {
058: super (type);
059:
060: // Store the element index and position
061: fLeaf = leaf;
062: fParticleId = id;
063: fPosition = position;
064: }
065:
066: //
067: // Package methods
068: //
069:
070: final Object getLeaf() {
071: return fLeaf;
072: }
073:
074: final int getParticleId() {
075: return fParticleId;
076: }
077:
078: final int getPosition() {
079: return fPosition;
080: }
081:
082: final void setPosition(int newPosition) {
083: fPosition = newPosition;
084: }
085:
086: //
087: // CMNode methods
088: //
089:
090: // package
091:
092: public boolean isNullable() {
093: // Leaf nodes are never nullable unless its an epsilon node
094: return (fPosition == -1);
095: }
096:
097: public String toString() {
098: StringBuffer strRet = new StringBuffer(fLeaf.toString());
099: if (fPosition >= 0) {
100: strRet.append(" (Pos:").append(Integer.toString(fPosition))
101: .append(')');
102: }
103: return strRet.toString();
104: }
105:
106: // protected
107:
108: protected void calcFirstPos(CMStateSet toSet) {
109: // If we are an epsilon node, then the first pos is an empty set
110: if (fPosition == -1)
111: toSet.zeroBits();
112:
113: // Otherwise, its just the one bit of our position
114: else
115: toSet.setBit(fPosition);
116: }
117:
118: protected void calcLastPos(CMStateSet toSet) {
119: // If we are an epsilon node, then the last pos is an empty set
120: if (fPosition == -1)
121: toSet.zeroBits();
122:
123: // Otherwise, its just the one bit of our position
124: else
125: toSet.setBit(fPosition);
126: }
127:
128: } // class XSCMLeaf
|