From 8a9fc9f2357e54052374cf2ef003630a486a6c0a Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 11 Jan 2006 00:50:57 -0500 Subject: [PATCH] cleanup Walk a bit darcs-hash:20060111055057-5007d-f2f4f156059fafd3e91a346574712f61953630a4.gz --- src/edu/berkeley/sbp/Parser.java | 43 ++++-------------------- src/edu/berkeley/sbp/Walk.java | 8 ++--- src/edu/berkeley/sbp/misc/MetaGrammar.java | 2 +- src/edu/berkeley/sbp/misc/RegressionTests.java | 4 +-- src/edu/berkeley/sbp/tib/TibDoc.java | 2 +- tests/regression.tc | 3 +- 6 files changed, 16 insertions(+), 46 deletions(-) diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index db08afc..f642878 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -12,7 +12,7 @@ public abstract class Parser { /** create a parser to parse the grammar with start symbol u */ protected Parser(Union u) { this.pt = new Table(u, top()); } - //protected Parser(Table pt) { this.pt = pt; } + protected Parser(Table pt) { this.pt = pt; } /** implement this method to create the output forest corresponding to a lone shifted input token */ public abstract Forest shiftedToken(T t, Token.Location loc); @@ -20,17 +20,6 @@ public abstract class Parser { /** this method must return an empty topology of the input token type */ public abstract Topology top(); - /** parse input for a exactly one unique result, throwing Ambiguous if not unique or ParseFailed if none */ - public Tree parse1(Token.Stream input) throws IOException, ParseFailed, Ambiguous { - Forest ret = parse(input); - try { return ret.expand1(); } - catch (Ambiguous a) { - System.out.println("while expanding:"); - System.out.println(ret); - throw a; - } - } - /** parse input, using the table pt to drive the parser */ public Forest parse(Token.Stream input) throws IOException, ParseFailed { GSS gss = new GSS(); @@ -48,10 +37,6 @@ public abstract class Parser { current = next; } } - - - // Exceptions ////////////////////////////////////////////////////////////////////////////// - // Table ////////////////////////////////////////////////////////////////////////////// @@ -60,8 +45,6 @@ public abstract class Parser { public final Walk.Cache cache = this; - public HashMapBag byPosition = new HashMapBag(); - private void walk(Element e, HashSet hs) { if (e==null) return; if (hs.contains(e)) return; @@ -95,7 +78,7 @@ public abstract class Parser { HashSet all_elements = new HashSet(); walk(start0, all_elements); for(Element e : all_elements) - cache.ys.put(e, new Walk.YieldSet(e, cache).walk()); + cache.ys.addAll(e, new Walk.YieldSet(e, cache).walk()); HashSet hp = new HashSet(); reachable(start0, hp); this.start = new State(hp, all_states, all_elements); @@ -235,7 +218,6 @@ public abstract class Parser { // register ourselves in the all_states hash so that no // two states are ever created with an identical position set all_states.put(hs, this); - for(Position p : hs) byPosition.add(p,this); // Step 1a: examine all Position's in this state and compute the mappings from // sets of follow tokens (tokens which could follow this position) to sets @@ -268,27 +250,14 @@ public abstract class Parser { // "yields" [in one or more step] is used instead of "produces" [in exactly one step] // to avoid having to iteratively construct our set of States as shown in most // expositions of the algorithm (ie "keep doing XYZ until things stop changing"). - /* - for(Element e : all_elements) { - if (e instanceof Atom) continue; - HashSet h = new Walk.Closure(null, g.cache).closure(e, hs); - State s = all_states.get(h) == null ? new State(h, all_states, all_elements) : all_states.get(h); - if (gotoSetNonTerminals.get(e) != null) - throw new Error("this should not happen"); - gotoSetNonTerminals.put(e, s); - } - */ HashMapBag move = new HashMapBag(); for(Position p : hs) { Element e = p.element(); if (e==null) continue; - HashSet ys = cache.ys.get(e); - if (ys != null) { - for(Element y : ys) { - HashSet hp = new HashSet(); - reachable(p.next(), hp); - move.addAll(y, hp); - } + for(Element y : cache.ys.getAll(e)) { + HashSet hp = new HashSet(); + reachable(p.next(), hp); + move.addAll(y, hp); } } for(Element y : move) { diff --git a/src/edu/berkeley/sbp/Walk.java b/src/edu/berkeley/sbp/Walk.java index 0d4233a..db76747 100644 --- a/src/edu/berkeley/sbp/Walk.java +++ b/src/edu/berkeley/sbp/Walk.java @@ -1,7 +1,6 @@ package edu.berkeley.sbp; -import edu.berkeley.sbp.util.*; -import edu.berkeley.sbp.*; import edu.berkeley.sbp.*; +import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.Sequence.Position; import java.io.*; import java.util.*; @@ -138,7 +137,7 @@ abstract class Walk { if (top==null) continue; if (!(top.containsAll(((Atom)e)))) continue; } else { - if (c.ys.get(pos.element()).contains(e)) good = true; + if (c.ys.contains(pos.element(),e)) good = true; } if (good) { mp = pos; @@ -171,7 +170,8 @@ abstract class Walk { public final HashMap possiblyEpsilon = new HashMap(); public HashMap eof = new HashMap(); public HashMap follow = new HashMap(); - public HashMap> ys = new HashMap>(); + //public HashMap> ys = new HashMap>(); + public HashMapBag ys = new HashMapBag(); public HashMap atoms = new HashMap(); } } diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 146e94d..810c10c 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -278,7 +278,7 @@ public class MetaGrammar extends StringWalker { } out.append("\n // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED\n"); - new CharToken.CharToStringParser(MetaGrammar.make()).parse1(new CharToken.Stream(new InputStreamReader(new FileInputStream(args[0])))).toJava(out); + new CharToken.CharToStringParser(MetaGrammar.make()).parse(new CharToken.Stream(new InputStreamReader(new FileInputStream(args[0])))).expand1().toJava(out); out.append("\n // DO NOT EDIT STUFF ABOVE: IT IS AUTOMATICALLY GENERATED\n"); for(String s = br.readLine(); s != null; s = br.readLine()) out.append(s+"\n"); diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java index 266e8d5..5135c86 100644 --- a/src/edu/berkeley/sbp/misc/RegressionTests.java +++ b/src/edu/berkeley/sbp/misc/RegressionTests.java @@ -22,12 +22,12 @@ public class RegressionTests { //MetaGrammar mg0 = new MetaGrammar(); //mg0.walk(MetaGrammar.meta); //System.out.println(mg0); - Tree res = new CharToken.CharToStringParser(MetaGrammar.make()).parse1(new CharToken.Stream(new InputStreamReader(new FileInputStream(s[0])))); + Tree res = new CharToken.CharToStringParser(MetaGrammar.make()).parse(new CharToken.Stream(new InputStreamReader(new FileInputStream(s[0])))).expand1(); MetaGrammar mg = (MetaGrammar)new MetaGrammar().walk(res); //System.out.println(mg); Union meta = mg.done(); SequenceInputStream sis = new SequenceInputStream(new FileInputStream(s[0]), new FileInputStream(s[1])); - res = new CharToken.CharToStringParser(meta).parse1(new CharToken.Stream(new InputStreamReader(sis), "parsing " + s[1] + " using " + s[0])); + res = new CharToken.CharToStringParser(meta).parse(new CharToken.Stream(new InputStreamReader(sis), "parsing " + s[1] + " using " + s[0])).expand1(); Union testcasegrammar = ((MetaGrammar)new MetaGrammar("ts").walk(res)).done("ts"); if (testcasegrammar==null) return; CharToken.Stream cs = new CharToken.Stream(new InputStreamReader(new FileInputStream(s[2])), "parsing " + s[2] + " using " + s[1]); diff --git a/src/edu/berkeley/sbp/tib/TibDoc.java b/src/edu/berkeley/sbp/tib/TibDoc.java index 73dcc9d..a262191 100644 --- a/src/edu/berkeley/sbp/tib/TibDoc.java +++ b/src/edu/berkeley/sbp/tib/TibDoc.java @@ -14,7 +14,7 @@ public class TibDoc { public static void main(String[] s) throws Exception { System.out.println("parsing " + s[0]); - Tree res = new CharToken.CharToStringParser(MetaGrammar.make()).parse1(new CharToken.Stream(new FileInputStream(s[0]))); + Tree res = new CharToken.CharToStringParser(MetaGrammar.make()).parse(new CharToken.Stream(new FileInputStream(s[0]))).expand1(); MetaGrammar gram = (MetaGrammar)new Tib.Grammar().walk(res); //System.out.println(gram); Union mg = gram.done(); diff --git a/tests/regression.tc b/tests/regression.tc index ae452e9..5ef3edc 100644 --- a/tests/regression.tc +++ b/tests/regression.tc @@ -323,4 +323,5 @@ testcase { // // //} -// \ No newline at end of file +// + -- 1.7.10.4