diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-09-06 16:47:41 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-09-06 16:47:41 -0300 |
| commit | a30e080781d5f536d09aa2127a06ffb17fc1cdc0 (patch) | |
| tree | 7318b2c305ad701e9ebfb2aae7c4f20fc6522157 | |
| parent | c7fbd761c1cc8a8a553f79463ecb8dd02c43d0f8 (diff) | |
Convert to using ReportWriter
GenerationState now uses ReportWriter instead of StringBuilder. This
will make certain upcoming features (namely, formatting strings) work
much better
| -rw-r--r-- | src/main/java/bjc/rgens/parser/GenerationState.java | 55 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RGrammar.java | 7 |
2 files changed, 52 insertions, 10 deletions
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<String, String> vs, + public GenerationState(ReportWriter rw, Random rand, Map<String, String> vs, Map<String, Rule> 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<String, String> vars, Map<String, Rule> 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)); } /** |
