From 84a4a8204373b996105e69edf91d2f9fae7b4bcb Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 2 Jan 2006 00:56:38 -0500 Subject: [PATCH] refactored Element.reachable() darcs-hash:20060102055638-5007d-f8db0d2cb15d6da31acf84dd75b13ce59d171ec4.gz --- src/edu/berkeley/sbp/Atom.java | 2 -- src/edu/berkeley/sbp/Element.java | 3 --- src/edu/berkeley/sbp/Parser.java | 17 ++++++++++++++--- src/edu/berkeley/sbp/Sequence.java | 8 -------- src/edu/berkeley/sbp/Union.java | 2 -- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/edu/berkeley/sbp/Atom.java b/src/edu/berkeley/sbp/Atom.java index 61f120d..524ab3a 100644 --- a/src/edu/berkeley/sbp/Atom.java +++ b/src/edu/berkeley/sbp/Atom.java @@ -12,8 +12,6 @@ public abstract class Atom extends Element implements Topology< protected abstract Topology top(); - void reachable(HashSet h) { /* do-nothing */ } - public Topology toAtom() { return dup(); } /** equality is based on the underlying Topology */ diff --git a/src/edu/berkeley/sbp/Element.java b/src/edu/berkeley/sbp/Element.java index b440257..7e140f9 100644 --- a/src/edu/berkeley/sbp/Element.java +++ b/src/edu/berkeley/sbp/Element.java @@ -10,9 +10,6 @@ import java.lang.ref.*; /** 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 rp); - abstract Topology toAtom(); public Topology noFollow() { return null; } Forest epsilonForm() { throw new Error("no epsilon form: " + this); } diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 6986a4b..e707eac 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -13,6 +13,17 @@ public class Parser { private final Table pt; + private static void reachable(Element e, HashSet h) { + if (e instanceof Atom) return; + for(Sequence s : ((Union)e)) + reachable(s.firstp(), h); + } + private static void reachable(Position p, HashSet 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)); } @@ -80,7 +91,7 @@ public class Parser { public HashSet closure() { HashSet hp = new HashSet(); - start0.reachable(hp); + reachable(start0, hp); return hp; } public Position firstPosition() { return start0seq.firstp(); } @@ -223,7 +234,7 @@ public class Parser { if (position.isLast() || !(position.element() instanceof Atom)) continue; Atom a = (Atom)position.element(); HashSet hp = new HashSet(); - position.next().reachable(hp); + reachable(position.next(), hp); bag0.addAll(a.dup(), /*clo.walk()*/hp); } @@ -262,7 +273,7 @@ public class Parser { if (ys != null) { for(Element y : ys) { HashSet hp = new HashSet(); - p.next().reachable(hp); + reachable(p.next(), hp); move.addAll(y, hp); } } diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index e18f5ef..b332793 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -62,8 +62,6 @@ public abstract class Sequence extends Element implements Iterable { this.firstp = new Position(0); } - void reachable(HashSet h) { firstp().reachable(h); } - Forest epsilonForm() { return firstp().rewrite(null); } protected abstract Forest postReduce(Token.Location loc, Forest[] args); @@ -74,12 +72,6 @@ public abstract class Sequence extends Element implements Iterable { /** the imaginary position before or after an element of a sequence; corresponds to an "LR item" */ public class Position { - void reachable(HashSet 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; diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index db0db7d..b000f95 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -16,8 +16,6 @@ public class Union extends Element implements Iterable { public Iterator iterator() { return alternatives.iterator(); } - void reachable(HashSet h) { for(Sequence s : alternatives) s.reachable(h); } - Topology toAtom() { if (alternatives.size()==0) throw new RuntimeException("cannot build an Atom from a Union with no productions"); Topology ret = null; -- 1.7.10.4