public boolean needed_or_hated = false;
- final HashSet<Sequence> hated = new HashSet<Sequence>();
+ public HashMap<Sequence,Boolean> canNeed = new HashMap<Sequence,Boolean>();
+ public HashMap<Sequence,Boolean> canKill = new HashMap<Sequence,Boolean>();
+
+ final HashSet<Sequence> hated = new HashSet<Sequence>();
final HashSet<Sequence> needs = new HashSet<Sequence>();
final HashSet<Sequence> hates = new HashSet<Sequence>();
/** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */
class Position implements IntegerMappable {
+ public int ord = -1;
+ public int compareTo(Position p, Walk.Cache cache) {
+ Position position = this;
+ Position rposition = p;
+ int ret = 0;
+ if (Reduction.canKill(cache, position, rposition) &&
+ Reduction.canKill(cache, rposition, position)) throw new Error();
+ if (Reduction.canKill(cache, position, rposition)) ret = 1;
+ else if (Reduction.canKill(cache, rposition, position)) ret = -1;
+ if (Reduction.canNeed(cache, position, rposition)) ret = 1;
+ else if (Reduction.canNeed(cache, rposition, position)) ret = -1;
+ return ret;
+ }
+
private Forest zero = null;
public Forest zero(Input.Region reg) {
if (zero != null) return zero;