From 888e9ccbab5f458a727c16da9d9291fd8951d909 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 2 Jan 2006 02:31:07 -0500 Subject: [PATCH] eliminated Parser.Table.Top darcs-hash:20060102073107-5007d-a0da7be4ee14c8ee6d0001e86ffe709a4d07f772.gz --- src/edu/berkeley/sbp/Parser.java | 40 +++++++++++++++++++++----------------- src/edu/berkeley/sbp/Walk.java | 4 +--- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index e8e0dc8..5b31b31 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -13,17 +13,6 @@ public abstract 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); - } - /** * create a parser to parse the grammar with start symbol u */ @@ -82,12 +71,10 @@ public abstract class Parser { // Table ////////////////////////////////////////////////////////////////////////////// - static class Top extends Union { public Top() { super("0"); } } - /** an SLR(1) parse table which may contain conflicts */ static class Table { - private final Union start0 = new Top(); + private final Union start0 = new Union("0"); private final Sequence start0seq; public final Walk.Cache cache = new Walk.Cache(); @@ -97,8 +84,6 @@ public abstract class Parser { reachable(start0, hp); return hp; } - public Position firstPosition() { return start0seq.firstp(); } - public Position lastPosition() { Position ret = start0seq.firstp(); while(!ret.isLast()) ret = ret.next(); return ret; } private void walk(Element e, HashSet hs) { if (e==null) return; @@ -137,12 +122,16 @@ public abstract class Parser { public Table(Topology top) { this("s", top); } public Table(String startSymbol, Topology top) { this(new Union(startSymbol), top); } public Table(Union u, Topology top) { + cache.eof.put(start0, true); start0seq = new Sequence.Singleton(u, null, null); + cache.eof.put(start0seq, true); start0.add(start0seq); // construct the set of states HashMap,State> all_states = new HashMap,State>(); HashSet all_elements = walk(); + all_elements.add(start0); + all_elements.add(start0seq); for(Element e : all_elements) cache.ys.put(e, new Walk.YieldSet(e, cache).walk()); this.start = new State(closure(), all_states, all_elements); @@ -152,7 +141,7 @@ public abstract class Parser { for(Position p : state.hs) { // the Grammar's designated "last position" is the only accepting state - if (p==lastPosition()) + if (p==start0seq.firstp().next()) state.accept = true; // FIXME: how does right-nullability interact with follow restrictions? @@ -238,7 +227,7 @@ public abstract class Parser { Atom a = (Atom)position.element(); HashSet hp = new HashSet(); reachable(position.next(), hp); - bag0.addAll(a, /*clo.walk()*/hp); + bag0.addAll(a, hp); } // Step 1b: for each _minimal, contiguous_ set of characters having an identical next-position @@ -348,4 +337,19 @@ public abstract class Parser { } private static final Forest[] emptyForestArray = new Forest[0]; + + + // Helpers ////////////////////////////////////////////////////////////////////////////// + + 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); + } + } diff --git a/src/edu/berkeley/sbp/Walk.java b/src/edu/berkeley/sbp/Walk.java index b7f147d..0d4233a 100644 --- a/src/edu/berkeley/sbp/Walk.java +++ b/src/edu/berkeley/sbp/Walk.java @@ -121,13 +121,11 @@ abstract class Walk { Topology cso = cs; boolean eofo = eof; - eof = false; + eof = c.eof.get(e) != null && c.eof.get(e).booleanValue(); cs = cso.empty(); - if (e instanceof Parser.Top) eof = true; for(Element x : all) { boolean matched = false; - if (x instanceof Parser.Top) walk(x); // because this symbol might not appear in any other Sequence if (!(x instanceof Sequence)) continue; Sequence a = (Sequence)x; Position mp = null; -- 1.7.10.4