1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2010 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.analysis; 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.misc.IntSet; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.misc.IntervalSet; 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Grammar; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** An LL(1) lookahead set; contains a set of token types and a "hasEOF" 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * condition when the set contains EOF. Since EOF is -1 everywhere and -1 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * cannot be stored in my BitSet, I set a condition here. There may be other 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * reasons in the future to abstract a LookaheadSet over a raw BitSet. 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class LookaheadSet { 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public IntervalSet tokenTypeSet; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet() { 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenTypeSet = new IntervalSet(); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet(IntSet s) { 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this(); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenTypeSet.addAll(s); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet(int atom) { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenTypeSet = IntervalSet.of(atom); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet(LookaheadSet other) { 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this(); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.tokenTypeSet.addAll(other.tokenTypeSet); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void orInPlace(LookaheadSet other) { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.tokenTypeSet.addAll(other.tokenTypeSet); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet or(LookaheadSet other) { 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new LookaheadSet(tokenTypeSet.or(other.tokenTypeSet)); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet subtract(LookaheadSet other) { 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new LookaheadSet(this.tokenTypeSet.subtract(other.tokenTypeSet)); 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean member(int a) { 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenTypeSet.member(a); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public LookaheadSet intersection(LookaheadSet s) { 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver IntSet i = this.tokenTypeSet.and(s.tokenTypeSet); 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver LookaheadSet intersection = new LookaheadSet(i); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return intersection; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean isNil() { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenTypeSet.isNil(); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public void remove(int a) { 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokenTypeSet = (IntervalSet)tokenTypeSet.subtract(IntervalSet.of(a)); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public int hashCode() { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenTypeSet.hashCode(); 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public boolean equals(Object other) { 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tokenTypeSet.equals(((LookaheadSet)other).tokenTypeSet); 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String toString(Grammar g) { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( tokenTypeSet==null ) { 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return ""; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String r = tokenTypeSet.toString(g); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return r; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public String toString() { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return toString(null); 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 110