01: /*
02: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
03: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
04: *
05: * This code is free software; you can redistribute it and/or modify it
06: * under the terms of the GNU General Public License version 2 only, as
07: * published by the Free Software Foundation. Sun designates this
08: * particular file as subject to the "Classpath" exception as provided
09: * by Sun in the LICENSE file that accompanied this code.
10: *
11: * This code is distributed in the hope that it will be useful, but WITHOUT
12: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14: * version 2 for more details (a copy is included in the LICENSE file that
15: * accompanied this code).
16: *
17: * You should have received a copy of the GNU General Public License version
18: * 2 along with this work; if not, write to the Free Software Foundation,
19: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20: *
21: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22: * CA 95054 USA or visit www.sun.com if you need additional information or
23: * have any questions.
24: */
25:
26: package com.sun.tools.internal.xjc.reader.gbind;
27:
28: /**
29: * {@link Expression} that represents a concatanation of two expressions
30: * "A,B".
31: *
32: * @author Kohsuke Kawaguchi
33: */
34: public final class Sequence extends Expression {
35: /**
36: * 'A' of 'A,B'
37: */
38: private final Expression lhs;
39: /**
40: * 'B' of 'A,B'
41: */
42: private final Expression rhs;
43: /**
44: * Compute this value eagerly for better performance
45: */
46: private final boolean isNullable;
47:
48: /**
49: * Cached value of {@link #lastSet()} for better performance.
50: * Sequence tends to be where the recursive lastSet computation occurs.
51: */
52: private ElementSet lastSet;
53:
54: public Sequence(Expression lhs, Expression rhs) {
55: this .lhs = lhs;
56: this .rhs = rhs;
57: isNullable = lhs.isNullable() && rhs.isNullable();
58: }
59:
60: ElementSet lastSet() {
61: if (lastSet == null) {
62: if (rhs.isNullable())
63: lastSet = ElementSets.union(lhs.lastSet(), rhs
64: .lastSet());
65: else
66: lastSet = rhs.lastSet();
67: }
68: return lastSet;
69: }
70:
71: boolean isNullable() {
72: return isNullable;
73: }
74:
75: void buildDAG(ElementSet incoming) {
76: lhs.buildDAG(incoming);
77: if (lhs.isNullable())
78: rhs.buildDAG(ElementSets.union(incoming, lhs.lastSet()));
79: else
80: rhs.buildDAG(lhs.lastSet());
81: }
82:
83: public String toString() {
84: return '(' + lhs.toString() + ',' + rhs.toString() + ')';
85: }
86: }
|