import java.lang.reflect.*;
/** implements Tomita's Graph Structured Stack */
-public class GSS {
+class GSS {
- public static int count = 0;
- public static int shifts = 0;
- public static int reductions = 0;
+ static int count = 0;
+ static int shifts = 0;
+ static int reductions = 0;
+ int resets = 0;
+ int waits = 0;
public GSS() { }
private Phase.Node[] reducing_list = null;
- public int resets = 0;
- public int waits = 0;
// FIXME: right now, these are the performance bottleneck
HashMapBag<Sequence,Phase.Waiting> waiting = new HashMapBag<Sequence,Phase.Waiting>();
HashMapBag<Integer,Sequence> expected = new HashMapBag<Integer,Sequence>();
/** FIXME */
- public Forest.Ref finalResult;
+ Forest.Many finalResult;
/** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
class Phase<Tok> implements Invokable<State, Forest, Phase<Tok>.Node>, IntegerMappable, GraphViz.ToGraphViz, Iterable<Phase.Node> {
boolean ok = false;
for(Phase.Node n : hash.values()) {
if (token == null && n.state.isAccepting()) {
- if (finalResult==null) finalResult = new Forest.Ref();
+ if (finalResult==null) finalResult = new Forest.Many();
for(Object f : n.results())
finalResult.merge((Forest)f);
}
/** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
public Phase phase() { return Phase.this; }
- private HashSet<Forest.Ref> resultMap = new HashSet<Forest.Ref>();
- public Iterable<Forest.Ref> results() { return resultMap; }
+ private HashSet<Forest.Many> resultMap = new HashSet<Forest.Many>();
+ public Iterable<Forest.Many> results() { return resultMap; }
public FastSet<Node> parents() { return set; }
public boolean merge(Node parent, Forest result) {
// FIXME: inefficient!
- for(Forest.Ref f : results()) {
+ for(Forest.Many f : results()) {
if (f.parents.contains(parent) /* UGLY: */ && f.parents.size()==1) {
f.merge(result);
return true;
}
}
- Forest.Ref f = new Forest.Ref();
+ Forest.Many f = new Forest.Many();
f.parents.add(parent);
f.merge(result);
resultMap.add(f);
Forest[] holder = r.holder;
Forest old = holder[pos];
- for(Forest result : results())
- for(Node child : ((Forest.Ref<?>)result).parents) {
+ HashSet<Forest> rr = new HashSet<Forest>();
+ for(Forest result : results()) rr.add(result);
+ for(Forest result : rr)
+ for(Node child : ((Forest.Many<?>)result).parents) {
if (only != null && child!=only) continue;
holder[pos] = result;
if (pos==0) child.finish(r, r.rewrite(new Input.Region(child.phase().getLocation(), phase().getLocation())), target);