/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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.Iterator; import java.util.TreeMap; import java.util.Vector; @SuppressWarnings({"rawtypes", "unchecked"}) final class LR0ItemSet implements Cloneable, Comparable { private final TreeMap items; private int hashCode; LR0ItemSet() { items = new TreeMap(); } private LR0ItemSet(LR0ItemSet set ) { items = (TreeMap) set.items.clone(); } void set (LR0Item item) { if (items.put(item, item) == null) { hashCode += item.hashCode(); modified_ = true; } } boolean get (LR0Item item) { return items.get(item) != null; } LR0Item[] items_; boolean modified_ = true; private void computeArray() { Vector itemVector = new Vector(0); for (Iterator e = items.keySet().iterator(); e.hasNext(); ) { itemVector.addElement(e.next()); } items_ = new LR0Item[itemVector.size()]; itemVector.copyInto(items_); modified_ = false; } LR0Item[] items() { if (modified_) { computeArray(); } return items_; } @Override public String toString() { StringBuffer result = new StringBuffer(); result.append("{"); Production[] productions = Production.productions(); boolean space = false; for (int i = 0; i < productions.length; i++) { int rightsideLength = productions[i].rightside().length; for (int j = 0; j <= rightsideLength; j++) { LR0Item item = new LR0Item(productions[i].index, j); if (get (item)) { if (space) { result.append(","); } else { space = true; } result.append(item); } } } result.append("}"); return result.toString(); } @Override public Object clone() { return new LR0ItemSet(this); } @Override public boolean equals(Object obj) { if ((obj == null) || (obj.getClass() != this.getClass())) { return false; } LR0ItemSet set = (LR0ItemSet) obj; if (set.items.size() != items.size()) { return false; } for (Iterator e = items.keySet().iterator(); e.hasNext(); ) { if (!set.get((LR0Item) e.next())) { return false; } } return true; } @Override public int hashCode() { return hashCode; } @Override public int compareTo(Object object) { LR0ItemSet set = (LR0ItemSet) object; int result = items.size() - set.items.size(); if (result == 0) { Iterator e = items.keySet().iterator(); Iterator f = set.items.keySet().iterator(); while (e.hasNext() && f.hasNext() && (result == 0)) { result = ((LR0Item) e.next()).compareTo(f.next()); } if (result == 0) { if (e.hasNext()) { return 1; } if (f.hasNext()) { return -1; } } } return result; } }