/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This file is part of SableCC. *
* See the file "LICENSE" for copyright information and the *
* terms and conditions for copying, distribution and *
* modification of SableCC. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package org.sablecc.sablecc;
import java.util.TreeMap;
import java.util.Vector;
@SuppressWarnings({"rawtypes", "unchecked"})
final class LR0Collection {
private final Vector sets = new Vector(0);
private final TreeMap setIndices = new TreeMap();
private final Vector GOTO = new Vector(0);
final Vector names = new Vector(0);
LR0Collection(LR0ItemSet set
) {
add
(set
, -1, null);
for (int i = 0; i < sets.size(); i++) {
System.out.print(".");
Symbol[] symbols = Symbol.symbols();
for (int j = 0; j < symbols.length; j++) {
addGoto(i, symbols[j], Grammar.GOTO(set
(i), symbols[j]));
}
}
System.out.println();
}
private int add
(LR0ItemSet set
, int from, Symbol symbol) {
Integer result = set
(set
);
if (result == null) {
result = new Integer(sets.size());
setIndices.put(set
, result);
sets.addElement(set
);
GOTO.addElement(new TreeMap());
if (from == -1) {
names.addElement(" ");
} else {
names.addElement(names.elementAt(from) + "" + symbol + " ");
}
}
return result.intValue();
}
private static LR0ItemSet empty = new LR0ItemSet();
public static void reinit() {
empty = new LR0ItemSet();
}
private void addGoto(int from, Symbol symbol, LR0ItemSet to) {
if (!to.equals(empty)) {
((TreeMap) GOTO.elementAt(from)).put(symbol, new Integer(add
(to, from, symbol)));
}
}
private Integer set
(LR0ItemSet set
) {
return (Integer) setIndices.get(set
);
}
private LR0ItemSet set
(int index) {
return (LR0ItemSet) sets.elementAt(index);
}
LR0ItemSet[] sets() {
LR0ItemSet[] result = new LR0ItemSet[sets.size()];
sets.copyInto(result);
return result;
}
Integer GOTO(int set
, Symbol symbol) {
return (Integer) ((TreeMap) GOTO.elementAt(set
)).get(symbol);
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
result.append("{[LR0ItemCollection]" + System.getProperty("line.separator"));
LR0ItemSet[] sets = sets();
Symbol[] symbols = Symbol.symbols();
for (int i = 0; i < sets.length; i++) {
result.append(i + ":" + Grammar.CLOSURE(sets[i]));
result.append(System.getProperty("line.separator"));
for (int j = 0; j < symbols.length; j++) {
if (GOTO(i, symbols[j]) != null) {
result.append("[");
result.append(symbols[j]);
result.append(":");
result.append(GOTO(i, symbols[j]));
result.append("]");
}
}
result.append(System.getProperty("line.separator"));
}
result.append("}");
return result.toString();
}
}