HashMapBag<Integer,Sequence> expectedInhibit = new HashMapBag<Integer,Sequence>();
HashMapBag<Sequence,Phase.Waiting> waiting = new HashMapBag<Sequence,Phase.Waiting>();
HashMapBag<Integer,Sequence> performed = new HashMapBag<Integer,Sequence>();
+ HashMapBag<Integer,Sequence> lastperformed = new HashMapBag<Integer,Sequence>();
/** FIXME */
public Forest.Ref finalResult;
public void reset() throws ParseFailed {
waiting.clear();
+ lastperformed.clear();
+ lastperformed.addAll(performed);
performed.clear();
hash = new IntPairMap<Phase.Node>();
singularReductions = new IntPairMap<Forest>();
int pos = parent==null?0:parent.phase()==null?0:parent.phase().pos;
Sequence owner = reduction==null ? null : reduction.owner();
if (reduction!=null) {
+ if (owner.hates!=null) {
+ for (Sequence s : lastperformed.getAll(pos))
+ if (owner.hates.contains(s))
+ return;
+ for (Sequence s : performed.getAll(pos))
+ if (owner.hates.contains(s))
+ return;
+ }
if (inhibited.contains(pos, owner)) return;
if (owner.needs != null)
for(Sequence s : owner.needs)
waiting.add(s, new Waiting(parent, pending, state, fromEmptyReduction, reduction));
return;
}
+ /*
if ((owner.needed != null && owner.needed.size()>0) ||
(owner.hated != null && owner.hated.size()>0) ||
(owner.hates != null && owner.hates.size()>0))
performed.add(pos, owner);
+ */
}
+ if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos);
if (!owner.lame)
newNode(parent, pending, state, fromEmptyReduction);
- if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos);
if (reduction != null) {
boolean redo = true;
while(redo) {
}
public void inhibit(int p, Sequence s) {
- if (inhibited.contains(p, s)) return;
- inhibited.add(p, s);
+ //if (inhibited.contains(p, s)) return;
+ if (performed.contains(p, s)) throw new Reset();
+ /*
if (s.hated!=null)
for(Sequence s2 : s.hated)
uninhibit(p, s2);
+ */
if (s.needed!=null)
for(Sequence s2 : s.needed)
if (performed.contains(p, s2))
public void uninhibit(Position r, int p) { uninhibit(p, r.owner()); }
public void uninhibit(int p, Sequence s) {
+ if (performed.contains(p, s)) return;
+ performed.add(p, s);
if (s.hated != null)
for(Sequence seq : s.hated)
inhibit(p, seq);
}
/*
if (expectedInhibit.size() > 0) {
+ System.out.println("\n!!!!");
+ for(int i : expectedInhibit)
+ for(Sequence es : expectedInhibit.getAll(i))
+ System.out.println(" " + i + ": " + es);
+ System.out.println("");
inhibited.removeAll(expectedInhibit);
- System.out.println("\n!!!!\n");
throw new Reset();
}
*/
+
+
+
+
// DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}),
new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "psx", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "ps", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "!", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "nonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }),
+
+
+
+