/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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.StringTokenizer;
@SuppressWarnings("rawtypes")
final class LR0Item implements Cloneable, Comparable {
final int production;
final int position;
LR0Item(int production, int position) {
this.production = production;
this.position = position;
}
@Override
public int compareTo(Object object) {
LR0Item item = (LR0Item) object;
int result = production - item.production;
if (result == 0) {
result = position - item.position;
}
return result;
}
@Override
public Object clone() {
return new LR0Item(production, position);
}
@Override
public boolean equals(Object obj) {
if ((obj == null) ||
(obj.getClass() != this.getClass())) {
return false;
}
LR0Item item = (LR0Item) obj;
return (item.production == production) &&
(item.position == position);
}
@Override
public int hashCode() {
return (production * 13) ^ (position * 17);
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
String prodStr = (Production.production(production)).toString();
int pos = 0;
StringTokenizer list = new StringTokenizer(prodStr, "= ");
// we know that there is at least one token (lhs)
result.append(list.nextToken());
result.append(" =");
while (list.hasMoreElements()) {
String tmp = list.nextToken();
if (pos == position) {
result.append(" * ");
result.append(tmp);
} else {
result.append(" ");
result.append(tmp);
}
pos++;
}
if (pos == position) {
result.append(" *");
}
return "[ " + result + " ]";
}
}