From a30e080781d5f536d09aa2127a06ffb17fc1cdc0 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Thu, 6 Sep 2018 16:47:41 -0300 Subject: Convert to using ReportWriter GenerationState now uses ReportWriter instead of StringBuilder. This will make certain upcoming features (namely, formatting strings) work much better --- .../java/bjc/rgens/parser/GenerationState.java | 55 ++++++++++++++++++---- src/main/java/bjc/rgens/parser/RGrammar.java | 7 ++- 2 files changed, 52 insertions(+), 10 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/bjc/rgens/parser/GenerationState.java b/src/main/java/bjc/rgens/parser/GenerationState.java index 361a17e..35d831d 100644 --- a/src/main/java/bjc/rgens/parser/GenerationState.java +++ b/src/main/java/bjc/rgens/parser/GenerationState.java @@ -3,6 +3,10 @@ package bjc.rgens.parser; import bjc.utils.esodata.MapSet; import bjc.utils.data.IPair; import bjc.utils.data.Pair; +import bjc.utils.ioutils.ReportWriter; + +import java.io.IOException; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; @@ -15,7 +19,7 @@ import static bjc.rgens.parser.RGrammarLogging.*; */ public class GenerationState { /** The current string. */ - private StringBuilder contents; + private ReportWriter contents; /** The RNG. */ public Random rnd; @@ -44,12 +48,12 @@ public class GenerationState { * @param vs * The variables to use. */ - public GenerationState(StringBuilder cont, Random rand, Map vs, + public GenerationState(ReportWriter rw, Random rand, Map vs, Map rvs, RGrammar gram) { vars = new MapSet<>(); rlVars = new MapSet<>(); - contents = cont; + contents = rw; rnd = rand; vars.setPutMap(gram.name, vs); @@ -66,7 +70,9 @@ public class GenerationState { } public static GenerationState fromGrammar(Random rand, RGrammar gram) { - return new GenerationState(new StringBuilder(), rand, new HashMap<>(), new HashMap<>(), gram); + ReportWriter rw = new ReportWriter(new StringWriter()); + + return new GenerationState(rw, rand, new HashMap<>(), new HashMap<>(), gram); } public void swapGrammar(RGrammar gram) { @@ -83,7 +89,16 @@ public class GenerationState { } public GenerationState newBuf() { - return new GenerationState(new StringBuilder(), rnd, vars, rlVars, gram); + // @NOTE 9/5/18 + // + // Not sure if this is the right thing to do or not. + // + // I suppose it'll only matter once we actually start using the + // features of ReportWriter, instead of just using the basic + // Writer functionality + ReportWriter rw = contents.duplicate(new StringWriter()); + + return new GenerationState(rw, rnd, vars, rlVars, gram); } /* @@ -156,11 +171,33 @@ public class GenerationState { } public void appendContents(String strang) { - contents.append(strang); + try { + contents.write(strang); + } catch (IOException ioex) { + throw new GrammarException("I/O Error", ioex); + } } public void setContents(String strang) { - contents = new StringBuilder(strang); + // @NOTE 9/5/18 + // + // This raises some interesting questions as to what the + // appropriate behavior is. + // + // For now, I'm simply going to say to go with a StringWriter + // and then write the contents to that, but I am not sure that + // that is the right way to go about it. + contents = contents.duplicate(new StringWriter()); + + try { + contents.write(strang); + } catch (IOException ioex) { + throw new GrammarException("I/O Error", ioex); + } + } + + public ReportWriter getWriter() { + return contents; } public String getContents() { @@ -168,10 +205,10 @@ public class GenerationState { } public void findReplaceContents(String find, String replace) { - contents = new StringBuilder(contents.toString().replaceAll(find, replace)); + setContents(getContents().replaceAll(find, replace)); } public void clearContents() { - contents = new StringBuilder(); + contents = contents.duplicate(new StringWriter()); } } diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java index c951cda..20ce320 100755 --- a/src/main/java/bjc/rgens/parser/RGrammar.java +++ b/src/main/java/bjc/rgens/parser/RGrammar.java @@ -3,9 +3,12 @@ package bjc.rgens.parser; import bjc.utils.data.IPair; import bjc.utils.data.Pair; import bjc.utils.funcutils.StringUtils; +import bjc.utils.ioutils.ReportWriter; import bjc.rgens.parser.elements.*; +import java.io.StringWriter; + import java.util.Arrays; import java.util.ArrayList; import java.util.HashMap; @@ -185,7 +188,9 @@ public class RGrammar { */ public String generate(String startRule, Random rnd, Map vars, Map rlVars) { - return generate(startRule, new GenerationState(new StringBuilder(), rnd, vars, rlVars, this)); + ReportWriter rw = new ReportWriter(new StringWriter()); + + return generate(startRule, new GenerationState(rw, rnd, vars, rlVars, this)); } /** -- cgit v1.2.3