diff options
Diffstat (limited to 'RGens/src/main')
11 files changed, 308 insertions, 128 deletions
diff --git a/RGens/src/main/java/bjc/RGens/ZadronsPouch.java b/RGens/src/main/java/bjc/RGens/ZadronsPouch.java index 742f0f3..279ef42 100644 --- a/RGens/src/main/java/bjc/RGens/ZadronsPouch.java +++ b/RGens/src/main/java/bjc/RGens/ZadronsPouch.java @@ -1,6 +1,7 @@ package bjc.RGens; import bjc.utils.funcdata.FunctionalStringTokenizer; +import bjc.utils.funcdata.IFunctionalList; import bjc.utils.funcdata.FunctionalList; import bjc.utils.gen.RandomGrammar; @@ -21,7 +22,7 @@ public class ZadronsPouch { ZadronsPouch zp = new ZadronsPouch(); for (int i = 0; i < 100; i++) { - FunctionalList<String> ls = zp.grammar + IFunctionalList<String> ls = zp.grammar .generateListValues("<item>", " "); StringBuilder sb = new StringBuilder(); @@ -155,7 +156,7 @@ public class ZadronsPouch { } private void addRule(String rule, String... cases) { - FunctionalList<FunctionalList<String>> cses = new FunctionalList<>(); + IFunctionalList<IFunctionalList<String>> cses = new FunctionalList<>(); for (String strang : cases) { cses.add(FunctionalStringTokenizer.fromString(strang) diff --git a/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java b/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java index 496cd30..a0be342 100644 --- a/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java +++ b/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java @@ -1,7 +1,7 @@ package bjc.RGens.parser; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; import java.util.Map; @@ -13,6 +13,12 @@ import bjc.utils.exceptions.UnknownPragmaException; import bjc.utils.funcdata.FunctionalStringTokenizer; import bjc.utils.gen.WeightedGrammar; +/** + * Read a weighted grammar from a stream + * + * @author ben + * + */ public class GrammarReader { private static Map<String, BiConsumer<StringTokenizer, ReaderState>> actMap; private static Map<String, BiConsumer<StringTokenizer, ReaderState>> pragmaMap; @@ -49,10 +55,14 @@ public class GrammarReader { pragmaMap.put("subordinate", GrammarReader::subordinateGrammar); } + /** + * @param stk + * documented to conform with expected sig + */ private static void debugGrammar(StringTokenizer stk, ReaderState rs) { System.out.println("Printing rule names: "); - for (String rul : rs.getRules().getRuleNames()) { + for (String rul : rs.currGrammar().getRuleNames().toIterable()) { System.out.println("\t" + rul); } @@ -66,7 +76,7 @@ public class GrammarReader { prob = Integer.parseInt(stk.nextToken()); } - rs.getRules().addCase(rs.getRule(), prob, + rs.currGrammar().addCase(rs.getRule(), prob, new FunctionalStringTokenizer(stk).toList(s -> s)); } @@ -80,7 +90,7 @@ public class GrammarReader { private static void doRule(String tk, StringTokenizer stk, ReaderState rs) { - rs.getRules().addRule(tk); + rs.currGrammar().addRule(tk); rs.setRule(tk); doCase(stk, rs); @@ -89,9 +99,16 @@ public class GrammarReader { private static void editSubGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); - rs.pushGrammar(rs.getRules().getSubgrammar(sgName)); + rs.pushGrammar(rs.currGrammar().getSubgrammar(sgName)); } + /** + * Create a grammar from the contents of the stream + * + * @param is + * The stream to read from + * @return A grammar, read from the contents of the stream + */ public static WeightedGrammar<String> fromStream(InputStream is) { ReaderState rs = new ReaderState(); rs.toggleUniformity(); @@ -117,14 +134,14 @@ public class GrammarReader { } scn.close(); - return rs.getRules(); + return rs.currGrammar(); } private static void importRule(StringTokenizer stk, ReaderState rs) { String ruleName = stk.nextToken(); String sgName = stk.nextToken(); - rs.getRules().addGrammarAlias(sgName, ruleName); + rs.currGrammar().addGrammarAlias(sgName, ruleName); } private static void initialRule(StringTokenizer stk, ReaderState rs) { @@ -155,23 +172,30 @@ public class GrammarReader { String sgName = stk.nextToken(); String fName = stk.nextToken(); - try { - rs.getRules().addSubgrammar(sgName, - fromStream(new FileInputStream(fName))); - } catch (FileNotFoundException e) { - throw new PragmaErrorException("Could not load subgrammar " - + sgName + " from file " + fName); + try (FileInputStream fileStream = new FileInputStream(fName)) { + + rs.currGrammar().addSubgrammar(sgName, fromStream(fileStream)); + } catch (IOException ioex) { + PragmaErrorException peex = new PragmaErrorException( + "Could not load subgrammar " + sgName + " from file " + + fName); + + peex.initCause(ioex); + + throw peex; } } + @SuppressWarnings("unused") private static void multiPrefixRule(StringTokenizer stk, ReaderState rs) { - + // TODO not yet implemented } + @SuppressWarnings("unused") private static void multiSuffixRule(StringTokenizer stk, ReaderState rs) { - + // TODO not yet implemented } private static void prefixRule(StringTokenizer stk, ReaderState rs) { @@ -180,7 +204,7 @@ public class GrammarReader { int addProb = rs.isUniform() ? 0 : Integer.parseInt(stk.nextToken()); - rs.getRules().prefixRule(rName, prefixToken, addProb); + rs.currGrammar().prefixRule(rName, prefixToken, addProb); } private static void promoteGrammar(StringTokenizer stk, @@ -188,29 +212,30 @@ public class GrammarReader { String gName = stk.nextToken(); String rName = stk.nextToken(); - WeightedGrammar<String> nwg = rs.getRules().getSubgrammar(gName); - rs.getRules().deleteSubgrammar(gName); + WeightedGrammar<String> nwg = rs.currGrammar() + .getSubgrammar(gName); + rs.currGrammar().deleteSubgrammar(gName); - nwg.addSubgrammar(rName, rs.getRules()); + nwg.addSubgrammar(rName, rs.currGrammar()); rs.setRules(nwg); } private static void removeRule(StringTokenizer stk, ReaderState rs) { String rName = stk.nextToken(); - rs.getRules().deleteRule(rName); + rs.currGrammar().deleteRule(rName); } private static void removeSubGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); - rs.getRules().deleteSubgrammar(sgName); + rs.currGrammar().deleteSubgrammar(sgName); } private static void saveGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); WeightedGrammar<String> sg = rs.popGrammar(); - rs.getRules().addSubgrammar(sgName, sg); + rs.currGrammar().addSubgrammar(sgName, sg); } private static void subordinateGrammar(StringTokenizer stk, @@ -218,7 +243,7 @@ public class GrammarReader { String gName = stk.nextToken(); WeightedGrammar<String> nwg = new WeightedGrammar<>(); - nwg.addSubgrammar(gName, rs.getRules()); + nwg.addSubgrammar(gName, rs.currGrammar()); rs.setRules(nwg); } @@ -228,6 +253,6 @@ public class GrammarReader { int addProb = rs.isUniform() ? 0 : Integer.parseInt(stk.nextToken()); - rs.getRules().suffixRule(rName, prefixToken, addProb); + rs.currGrammar().suffixRule(rName, prefixToken, addProb); } } diff --git a/RGens/src/main/java/bjc/RGens/parser/GrammarReaderApp.java b/RGens/src/main/java/bjc/RGens/parser/GrammarReaderApp.java index 8adaa62..c24b479 100644 --- a/RGens/src/main/java/bjc/RGens/parser/GrammarReaderApp.java +++ b/RGens/src/main/java/bjc/RGens/parser/GrammarReaderApp.java @@ -3,6 +3,7 @@ package bjc.RGens.parser; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.IOException; import java.io.PrintStream; import javax.swing.UIManager; @@ -12,8 +13,21 @@ import bjc.utils.gen.WeightedGrammar; import bjc.utils.gui.SimpleDialogs; import bjc.utils.gui.awt.SimpleFileDialog; +/** + * App that reads a grammar from a file and generates results + * + * @author ben + * + */ public class GrammarReaderApp { + /** + * Main method of class + * + * @param args + * CLI args + */ + @SuppressWarnings("null") public static void main(String[] args) { try { UIManager.setLookAndFeel( @@ -30,10 +44,9 @@ public class GrammarReaderApp { WeightedGrammar<String> wg = null; - try { - wg = RBGrammarReader.fromStream(new FileInputStream(gramFile)); - } catch (FileNotFoundException e) { - // TODO Auto-generated catch block + try (FileInputStream fStream = new FileInputStream(gramFile)) { + wg = RBGrammarReader.fromStream(fStream); + } catch (IOException e) { e.printStackTrace(); System.exit(1); } @@ -41,10 +54,13 @@ public class GrammarReaderApp { String initRule = ""; if (!wg.hasInitialRule()) { + wg.getRuleNames().sort((leftString, rightString) -> { + return leftString.compareTo(rightString); + }); + initRule = SimpleDialogs.getChoice(null, "Pick a initial rule", "Pick a initial rule to generate choices from", - wg.getRuleNames().stream().sorted() - .toArray(String[]::new)); + wg.getRuleNames().toArray(new String[0])); } else { initRule = wg.getInitialRule(); } @@ -74,5 +90,7 @@ public class GrammarReaderApp { ps.println(s); } + + ps.close(); } } diff --git a/RGens/src/main/java/bjc/RGens/parser/GrammarReaderCLI.java b/RGens/src/main/java/bjc/RGens/parser/GrammarReaderCLI.java index f782c5f..96d2f25 100644 --- a/RGens/src/main/java/bjc/RGens/parser/GrammarReaderCLI.java +++ b/RGens/src/main/java/bjc/RGens/parser/GrammarReaderCLI.java @@ -1,13 +1,25 @@ package bjc.RGens.parser; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import bjc.utils.gen.WeightedGrammar; +/** + * App that reads a grammar from a file and generates results + * + * @author ben + * + */ public class GrammarReaderCLI { private static WeightedGrammar<String> wg = null; + /** + * Main application method + * + * @param args + * CLI args + */ public static void main(String[] args) { if (args.length == 0) { GrammarReaderApp.main(args); @@ -22,14 +34,14 @@ public class GrammarReaderCLI { String rName = args[1]; - try { - wg = GrammarReader.fromStream(new FileInputStream(fName)); - } catch (FileNotFoundException e) { + try (FileInputStream fStream = new FileInputStream(fName)) { + wg = GrammarReader.fromStream(fStream); + } catch (IOException e) { e.printStackTrace(); } if (rName.equalsIgnoreCase("--list-rules")) { - for (String rn : wg.getRuleNames()) { + for (String rn : wg.getRuleNames().toIterable()) { System.out.println(rn); } System.exit(0); diff --git a/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java b/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java index bede82a..afa368b 100644 --- a/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java +++ b/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java @@ -1,9 +1,21 @@ package bjc.RGens.parser; +/** + * Exception for error executing a pragma + * + * @author ben + * + */ public class PragmaErrorException extends RuntimeException { private static final long serialVersionUID = 7245421182038076899L; + /** + * Create a new exception with the given message + * + * @param message + * The message of the exception + */ public PragmaErrorException(String message) { super(message); - } + } } diff --git a/RGens/src/main/java/bjc/RGens/parser/RBGrammarReader.java b/RGens/src/main/java/bjc/RGens/parser/RBGrammarReader.java index 86079ac..7f1af27 100644 --- a/RGens/src/main/java/bjc/RGens/parser/RBGrammarReader.java +++ b/RGens/src/main/java/bjc/RGens/parser/RBGrammarReader.java @@ -1,7 +1,7 @@ package bjc.RGens.parser; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import java.io.InputStream; import java.util.Hashtable; import java.util.Map; @@ -12,6 +12,12 @@ import bjc.utils.funcdata.FunctionalStringTokenizer; import bjc.utils.gen.WeightedGrammar; import bjc.utils.parserutils.RuleBasedConfigReader; +/** + * Read a grammar from a stream + * + * @author ben + * + */ public class RBGrammarReader { private static Map<String, BiConsumer<StringTokenizer, ReaderState>> pragmaMap; @@ -39,10 +45,12 @@ public class RBGrammarReader { pragmaMap.put("subordinate", RBGrammarReader::subordinateGrammar); } - private static void debugGrammar(StringTokenizer stk, ReaderState rs) { + private static void debugGrammar( + @SuppressWarnings("unused") StringTokenizer stk, + ReaderState rs) { System.out.println("Printing rule names: "); - for (String rul : rs.getRules().getRuleNames()) { + for (String rul : rs.currGrammar().getRuleNames().toIterable()) { System.out.println("\t" + rul); } @@ -56,16 +64,25 @@ public class RBGrammarReader { prob = Integer.parseInt(stk.nextToken()); } - rs.getRules().addCase(rs.getRule(), prob, + rs.currGrammar().addCase(rs.getRule(), prob, new FunctionalStringTokenizer(stk).toList(s -> s)); } private static void editSubGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); - rs.pushGrammar(rs.getRules().getSubgrammar(sgName)); - } - + rs.pushGrammar(rs.currGrammar().getSubgrammar(sgName)); + } + + /** + * Read a grammar from a stream + * + * @param is + * The stream to read from + * @return A grammar read from the stream + * + * TODO redo the implementation for this + */ public static WeightedGrammar<String> fromStream(InputStream is) { ReaderState rs = new ReaderState(); rs.toggleUniformity(); @@ -74,7 +91,7 @@ public class RBGrammarReader { null, null, null); reader.setStartRule((stk, par) -> par.doWith((left, right) -> { - rs.getRules().addRule(left); + rs.currGrammar().addRule(left); rs.setRule(left); doCase(stk.getInternal(), right); @@ -94,14 +111,14 @@ public class RBGrammarReader { }); }); - return reader.fromStream(is, rs).getRules(); + return reader.fromStream(is, rs).currGrammar(); } private static void importRule(StringTokenizer stk, ReaderState rs) { String ruleName = stk.nextToken(); String sgName = stk.nextToken(); - rs.getRules().addGrammarAlias(sgName, ruleName); + rs.currGrammar().addGrammarAlias(sgName, ruleName); } private static void initialRule(StringTokenizer stk, ReaderState rs) { @@ -134,20 +151,26 @@ public class RBGrammarReader { String sgName = stk.nextToken(); String fName = stk.nextToken(); - try { - rs.getRules().addSubgrammar(sgName, - fromStream(new FileInputStream(fName))); - } catch (FileNotFoundException e) { - throw new PragmaErrorException("Could not load subgrammar " - + sgName + " from file " + fName); + try (FileInputStream fStream = new FileInputStream(fName)) { + rs.currGrammar().addSubgrammar(sgName, fromStream(fStream)); + } catch (IOException e) { + PragmaErrorException peex = new PragmaErrorException( + "Could not load subgrammar " + sgName + " from file " + + fName); + + peex.initCause(e); + + throw peex; } } + @SuppressWarnings("unused") private static void multiPrefixRule(StringTokenizer stk, ReaderState rs) { // TODO implement me :) } + @SuppressWarnings("unused") private static void multiSuffixRule(StringTokenizer stk, ReaderState rs) { // TODO implement me :) @@ -159,7 +182,7 @@ public class RBGrammarReader { int addProb = rs.isUniform() ? 0 : Integer.parseInt(stk.nextToken()); - rs.getRules().prefixRule(rName, prefixToken, addProb); + rs.currGrammar().prefixRule(rName, prefixToken, addProb); } private static void promoteGrammar(StringTokenizer stk, @@ -167,29 +190,30 @@ public class RBGrammarReader { String gName = stk.nextToken(); String rName = stk.nextToken(); - WeightedGrammar<String> nwg = rs.getRules().getSubgrammar(gName); - rs.getRules().deleteSubgrammar(gName); + WeightedGrammar<String> nwg = rs.currGrammar() + .getSubgrammar(gName); + rs.currGrammar().deleteSubgrammar(gName); - nwg.addSubgrammar(rName, rs.getRules()); + nwg.addSubgrammar(rName, rs.currGrammar()); rs.setRules(nwg); } private static void removeRule(StringTokenizer stk, ReaderState rs) { String rName = stk.nextToken(); - rs.getRules().deleteRule(rName); + rs.currGrammar().deleteRule(rName); } private static void removeSubGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); - rs.getRules().deleteSubgrammar(sgName); + rs.currGrammar().deleteSubgrammar(sgName); } private static void saveGrammar(StringTokenizer stk, ReaderState rs) { String sgName = stk.nextToken(); WeightedGrammar<String> sg = rs.popGrammar(); - rs.getRules().addSubgrammar(sgName, sg); + rs.currGrammar().addSubgrammar(sgName, sg); } private static void subordinateGrammar(StringTokenizer stk, @@ -197,7 +221,7 @@ public class RBGrammarReader { String gName = stk.nextToken(); WeightedGrammar<String> nwg = new WeightedGrammar<>(); - nwg.addSubgrammar(gName, rs.getRules()); + nwg.addSubgrammar(gName, rs.currGrammar()); rs.setRules(nwg); } @@ -207,6 +231,6 @@ public class RBGrammarReader { int addProb = rs.isUniform() ? 0 : Integer.parseInt(stk.nextToken()); - rs.getRules().suffixRule(rName, prefixToken, addProb); + rs.currGrammar().suffixRule(rName, prefixToken, addProb); } } diff --git a/RGens/src/main/java/bjc/RGens/parser/ReaderState.java b/RGens/src/main/java/bjc/RGens/parser/ReaderState.java index 50be322..e115530 100644 --- a/RGens/src/main/java/bjc/RGens/parser/ReaderState.java +++ b/RGens/src/main/java/bjc/RGens/parser/ReaderState.java @@ -4,57 +4,119 @@ import java.util.Stack; import bjc.utils.gen.WeightedGrammar; +/** + * Represents the internal state of reader + * + * @author ben + * + */ public class ReaderState { - private String currRule = ""; + private String currRule = ""; // Pragma settings - private boolean isUniform = false; - - private Stack<WeightedGrammar<String>> wg; - + private boolean isUniform = false; + + private Stack<WeightedGrammar<String>> wg; + + /** + * Create a new reader state + */ public ReaderState() { - wg = new Stack<WeightedGrammar<String>>(); + wg = new Stack<>(); wg.push(new WeightedGrammar<>()); } - + + /** + * Get the current grammar + * + * @return The current grammar + */ public WeightedGrammar<String> currGrammar() { return wg.peek(); } - + + /** + * Get the current rule + * + * @return The current rule + */ public String getRule() { return currRule; } - + + /** + * Use {@link #currGrammar()} instead + * + * @return The current grammar + */ + @Deprecated public WeightedGrammar<String> getRules() { return wg.peek(); } - + + /** + * Check if this reader is currently in uniform mode + * + * @return Whether this grammar is in uniform mode + */ public boolean isUniform() { return isUniform; } - + + /** + * Pop the grammar currently being worked on + * + * @return The grammar currently being worked on + */ public WeightedGrammar<String> popGrammar() { return wg.pop(); } - + + /** + * Push a new grammar to work on + * + * @param nwg + * The new grammar to work on + */ public void pushGrammar(WeightedGrammar<String> nwg) { wg.push(nwg); } - + + /** + * Set the initial rule of this grammar + * + * @param rName + * The initial rule of this grammar + */ + public void setInitialRule(String rName) { + wg.peek().setInitialRule(rName); + } + + /** + * Set the rule currently being worked on + * + * @param r + * The rule currently being worked on + */ public void setRule(String r) { currRule = r; } - + + /** + * Set the current grammar to be the specified one + * + * @param nwg + * The new grammar to use + */ public void setRules(WeightedGrammar<String> nwg) { wg.pop(); wg.push(nwg); } - + + /** + * Toggle this grammars uniformity setting + */ public void toggleUniformity() { isUniform = !isUniform; } - - public void setInitialRule(String rName) { - wg.peek().setInitialRule(rName); - } } diff --git a/RGens/src/main/java/bjc/RGens/text/markov/FrequencyCounter.java b/RGens/src/main/java/bjc/RGens/text/markov/FrequencyCounter.java index abe1c8c..ccc8cb5 100755 --- a/RGens/src/main/java/bjc/RGens/text/markov/FrequencyCounter.java +++ b/RGens/src/main/java/bjc/RGens/text/markov/FrequencyCounter.java @@ -10,6 +10,12 @@ import java.util.*; */ public class FrequencyCounter { + /** + * Main method + * + * @param args + * CLI args + */ public static void main(String[] args) { String text; @@ -24,7 +30,7 @@ public class FrequencyCounter { Scanner s = new Scanner(System.in); text = s.nextLine(); - Map<String, Integer> hash = new HashMap<String, Integer>(); + Map<String, Integer> hash = new HashMap<>(); int distinct = 0; for (int i = 0; i <= text.length() - k; i++) { @@ -40,10 +46,9 @@ public class FrequencyCounter { hash.put(sub, m.count); distinct++; } - - s.close(); } + s.close(); System.out.println(distinct + " distinct keys"); Iterator<String> keys = hash.keySet().iterator(); diff --git a/RGens/src/main/java/bjc/RGens/text/markov/Markov.java b/RGens/src/main/java/bjc/RGens/text/markov/Markov.java index 1956111..7509a99 100755 --- a/RGens/src/main/java/bjc/RGens/text/markov/Markov.java +++ b/RGens/src/main/java/bjc/RGens/text/markov/Markov.java @@ -11,10 +11,10 @@ import java.util.*; * */ public class Markov { - String substring; - int count = 0; + String substring; + int count = 0; - TreeMap<Character, Integer> map; + TreeMap<Character, Integer> map; /** * Constructs a Markov object from a given substring. @@ -25,7 +25,7 @@ public class Markov { public Markov(String substring) { this.substring = substring; - map = new TreeMap<Character, Integer>(); + map = new TreeMap<>(); add(); } @@ -42,7 +42,7 @@ public class Markov { public Markov(String substring, Character suffix) { this.substring = substring; - map = new TreeMap<Character, Integer>(); + map = new TreeMap<>(); add(suffix); } @@ -82,23 +82,24 @@ public class Markov { public int getFrequencyCount(char c) { if (!map.containsKey(c)) { return -1; - } else { - return map.get(c); } + + return map.get(c); } /** * Gives a percentage of frequency count / number of total suffixes. * * @param c - * @return + * @return the ratio of frequency count of a single character to the + * total number of suffixes */ public double getCharFrequency(char c) { if (getFrequencyCount(c) == -1) { return -1; - } else { - return (double) getFrequencyCount(c) / (double) count; } + + return (double) getFrequencyCount(c) / (double) count; } /** @@ -111,9 +112,9 @@ public class Markov { public boolean containsChar(char c) { if (!map.containsKey(c)) { return false; - } else { - return true; } + + return true; } /** @@ -152,7 +153,7 @@ public class Markov { Iterator<Entry<Character, Integer>> it = s.iterator(); - ArrayList<Character> suffixes = new ArrayList<Character>(); + ArrayList<Character> suffixes = new ArrayList<>(); while (it.hasNext()) { Entry<Character, Integer> tmp = it.next(); @@ -173,6 +174,7 @@ public class Markov { * * @return said String representation. */ + @Override public String toString() { String ret = "Substring: " + substring + ", Count: " + count; ret += "\n" + "Suffixes and frequency counts: "; diff --git a/RGens/src/main/java/bjc/RGens/text/markov/SuffixCounter.java b/RGens/src/main/java/bjc/RGens/text/markov/SuffixCounter.java index 0a8034b..8f9a076 100755 --- a/RGens/src/main/java/bjc/RGens/text/markov/SuffixCounter.java +++ b/RGens/src/main/java/bjc/RGens/text/markov/SuffixCounter.java @@ -15,6 +15,12 @@ import java.util.Scanner; */ public class SuffixCounter { + /** + * Main method + * + * @param args + * CLI args + */ public static void main(String[] args) { String text; int k = 0; @@ -27,7 +33,7 @@ public class SuffixCounter { Scanner s = new Scanner(System.in); text = s.nextLine(); - Map<String, Markov> hash = new HashMap<String, Markov>(); + Map<String, Markov> hash = new HashMap<>(); int distinct = 0; diff --git a/RGens/src/main/java/bjc/RGens/text/markov/TextGenerator.java b/RGens/src/main/java/bjc/RGens/text/markov/TextGenerator.java index 8c8bf57..1a76e86 100755 --- a/RGens/src/main/java/bjc/RGens/text/markov/TextGenerator.java +++ b/RGens/src/main/java/bjc/RGens/text/markov/TextGenerator.java @@ -4,6 +4,12 @@ import java.io.*; import java.util.*; import java.util.Map.Entry; +/** + * Generate text from a markov model of an input text + * + * @author ben + * + */ public class TextGenerator { /** @@ -18,6 +24,7 @@ public class TextGenerator { * the file to be read. The generated text will be the same * number of characters as the original file. */ + @SuppressWarnings("null") public static void main(String[] args) { int k = 0; int M = 0; @@ -45,17 +52,47 @@ public class TextGenerator { System.exit(1); } - FileReader reader = null; + Map<String, Markov> hash = null; - try { - reader = new FileReader(file); + try (FileReader reader = new FileReader(file)) { + hash = generateMarkovMap(k, M, text, reader); } catch (FileNotFoundException e) { System.out.println("File not found."); e.printStackTrace(); System.exit(1); + } catch (IOException ioex) { + System.out.println("IOException"); + ioex.printStackTrace(); + System.exit(1); } - Map<String, Markov> hash = new HashMap<String, Markov>(); + if (hash.size() < 100) { + Iterator<String> keys = hash.keySet().iterator(); + + while (keys.hasNext()) { + String hashKey = keys.next(); + Markov hashValue = hash.get(hashKey); + + System.out.print(hashValue.count() + " " + hashKey + ":"); + + for (Entry<Character, Integer> entry : hashValue.getMap() + .entrySet()) { + char suffix = entry.getKey(); + int frequencyCount = entry.getValue(); + System.out.print(" " + frequencyCount + " " + suffix); + } + + System.out.println(); + } + } + + System.out.println( + text.toString().substring(0, Math.min(M, text.length()))); + } + + private static Map<String, Markov> generateMarkovMap(int k, int M, + StringBuilder text, Reader reader) { + Map<String, Markov> hash = new HashMap<>(); Character next = null; @@ -100,9 +137,6 @@ public class TextGenerator { } } - if (M == 0) { - M = origFile.length(); - } for (int i = k; i < M; i++) { if (i == k) { text.append(firstSub); @@ -122,27 +156,6 @@ public class TextGenerator { } } - if (hash.size() < 100) { - Iterator<String> keys = hash.keySet().iterator(); - - while (keys.hasNext()) { - String hashKey = keys.next(); - Markov hashValue = hash.get(hashKey); - - System.out.print(hashValue.count() + " " + hashKey + ":"); - - for (Entry<Character, Integer> entry : hashValue.getMap() - .entrySet()) { - char suffix = entry.getKey(); - int frequencyCount = entry.getValue(); - System.out.print(" " + frequencyCount + " " + suffix); - } - - System.out.println(); - } - } - - System.out.println( - text.toString().substring(0, Math.min(M, text.length()))); + return hash; } }
\ No newline at end of file |
