/** the root superclass for all components of the grammar (terminals, nonterminals, literals, etc) */
public abstract class Element {
- /** add all positions reachable from the start of this Element to @rp */
- abstract void reachable(HashSet<Sequence.Position> rp);
-
abstract Topology toAtom();
public Topology noFollow() { return null; }
Forest epsilonForm() { throw new Error("no epsilon form: " + this); }
private final Table pt;
+ private static void reachable(Element e, HashSet<Position> h) {
+ if (e instanceof Atom) return;
+ for(Sequence s : ((Union)e))
+ reachable(s.firstp(), h);
+ }
+ private static void reachable(Position p, HashSet<Position> h) {
+ if (h.contains(p)) return;
+ h.add(p);
+ if (p.element() != null) reachable(p.element(), h);
+ }
+
//public Parser( Topology top) { this(new Table( top)); }
//public Parser(String s, Topology top) { this(new Table(s, top)); }
public HashSet<Position> closure() {
HashSet<Position> hp = new HashSet<Position>();
- start0.reachable(hp);
+ reachable(start0, hp);
return hp;
}
public Position firstPosition() { return start0seq.firstp(); }
if (position.isLast() || !(position.element() instanceof Atom)) continue;
Atom a = (Atom)position.element();
HashSet<Position> hp = new HashSet<Position>();
- position.next().reachable(hp);
+ reachable(position.next(), hp);
bag0.addAll(a.dup(), /*clo.walk()*/hp);
}
if (ys != null) {
for(Element y : ys) {
HashSet<Position> hp = new HashSet<Position>();
- p.next().reachable(hp);
+ reachable(p.next(), hp);
move.addAll(y, hp);
}
}
this.firstp = new Position(0);
}
- void reachable(HashSet<Position> h) { firstp().reachable(h); }
-
Forest epsilonForm() { return firstp().rewrite(null); }
protected abstract <T> Forest<T> postReduce(Token.Location loc, Forest<T>[] args);
/** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */
public class Position {
- void reachable(HashSet<Position> h) {
- if (h.contains(this)) return;
- h.add(this);
- if (element() != null) element().reachable(h);
- }
-
final int pos;
private final Position next;
final Forest[] holder;