diff options
Diffstat (limited to 'RGens/src/main/java')
| -rw-r--r-- | RGens/src/main/java/bjc/RGens/ZadronsPouch.java | 28 | ||||
| -rw-r--r-- | RGens/src/main/java/bjc/RGens/parser/GrammarReader.java (renamed from RGens/src/main/java/bjc/RGens/text/GrammarReader.java) | 75 | ||||
| -rw-r--r-- | RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java (renamed from RGens/src/main/java/bjc/RGens/text/PragmaErrorException.java) | 2 | ||||
| -rw-r--r-- | RGens/src/main/java/bjc/RGens/parser/ReaderState.java (renamed from RGens/src/main/java/bjc/RGens/text/ReaderState.java) | 43 | ||||
| -rw-r--r-- | RGens/src/main/java/bjc/RGens/parser/UnknownPragmaException.java (renamed from RGens/src/main/java/bjc/RGens/text/UnknownPragmaException.java) | 2 |
5 files changed, 106 insertions, 44 deletions
diff --git a/RGens/src/main/java/bjc/RGens/ZadronsPouch.java b/RGens/src/main/java/bjc/RGens/ZadronsPouch.java index fd2b65c..240e967 100644 --- a/RGens/src/main/java/bjc/RGens/ZadronsPouch.java +++ b/RGens/src/main/java/bjc/RGens/ZadronsPouch.java @@ -17,6 +17,10 @@ public class ZadronsPouch { System.out.println(sb.toString().replaceAll("\\s+", " ")); } + + System.out.println(); + System.out.println(); + System.out.println(); } private RandomGrammar<String> wg; @@ -53,18 +57,6 @@ public class ZadronsPouch { addWandRules(); } - private void addWandRules() { - addRule("<wand>", "<wand-type> wand", "wand of <wand-type>", - "canceling <wand-type> wand"); - addRule("<wand-type>", "magic missile", "<spell-1>", "<spell-2>", - "gusting", "life-detecting", "zadron"); - addRule("<spell-1>", "frost", "fire", "lightning", "fear", - "illumination", "polymorphing", "conjuration", - "paralyzing"); - addRule("<spell-2>", "<spell2-type> detecting"); - addRule("<spell-2>", "magic", "enemy", "secret door/trap"); - } - private void addBagRules() { addRule("<bag>", "bag of <bag-type>", "<sack-type> sack", "<purse-type> purse"); @@ -170,4 +162,16 @@ public class ZadronsPouch { "blank potion"); addRule("<flask-type>", "iron"); } + + private void addWandRules() { + addRule("<wand>", "<wand-type> wand", "wand of <wand-type>", + "canceling <wand-type> wand"); + addRule("<wand-type>", "magic missile", "<spell-1>", "<spell-2>", + "gusting", "life-detecting", "zadron"); + addRule("<spell-1>", "frost", "fire", "lightning", "fear", + "illumination", "polymorphing", "conjuration", + "paralyzing"); + addRule("<spell-2>", "<spell2-type> detecting"); + addRule("<spell2-type>", "magic", "enemy", "secret door/trap"); + } } diff --git a/RGens/src/main/java/bjc/RGens/text/GrammarReader.java b/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java index df633de..e83eede 100644 --- a/RGens/src/main/java/bjc/RGens/text/GrammarReader.java +++ b/RGens/src/main/java/bjc/RGens/parser/GrammarReader.java @@ -1,9 +1,9 @@ -package bjc.RGens.text; +package bjc.RGens.parser; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; -import java.util.HashMap; +import java.util.Hashtable; import java.util.Map; import java.util.Scanner; import java.util.StringTokenizer; @@ -19,12 +19,12 @@ public class GrammarReader { static { initPragmas(); - actMap = new HashMap<>(); - + actMap = new Hashtable<>(); + actMap.put("#", (stk, rs) -> { return; }); - + actMap.put("pragma", GrammarReader::doPragmas); actMap.put("\t", GrammarReader::doCase); } @@ -36,7 +36,8 @@ public class GrammarReader { prob = Integer.parseInt(stk.nextToken()); } - rs.getRules().addCase(rs.getRule(), prob, new FunctionalStringTokenizer(stk).toList(s -> s)); + rs.getRules().addCase(rs.getRule(), prob, + new FunctionalStringTokenizer(stk).toList(s -> s)); } private static void doPragmas(StringTokenizer stk, ReaderState rs) { @@ -50,6 +51,7 @@ public class GrammarReader { private static void doRule(String tk, StringTokenizer stk, ReaderState rs) { rs.getRules().addRule(tk); + rs.setRule(tk); doCase(stk, rs); } @@ -62,21 +64,26 @@ public class GrammarReader { public static WeightedGrammar<String> fromStream(InputStream is) { ReaderState rs = new ReaderState(); + rs.toggleUniformity(); Scanner scn = new Scanner(is); while (scn.hasNextLine()) { String ln = scn.nextLine(); - + if (ln.equals("")) { rs.setRule(null); continue; + } else if (ln.startsWith("\t")) { + doCase(new StringTokenizer(ln.substring(1), " "), rs); + } else { + StringTokenizer stk = new StringTokenizer(ln, " "); + + String nxtToken = stk.nextToken(); + actMap.getOrDefault(nxtToken, + (stak, ras) -> doRule(nxtToken, stak, ras)) + .accept(stk, rs); } - - StringTokenizer stk = new StringTokenizer(ln, " "); - - actMap.getOrDefault(stk.nextToken(), (stak, ras) -> doRule(stk.nextToken(), stak, ras)) - .accept(stk, rs); } scn.close(); @@ -84,7 +91,7 @@ public class GrammarReader { } private static void initPragmas() { - pragmaMap = new HashMap<>(); + pragmaMap = new Hashtable<>(); pragmaMap.put("uniform", (stk, rs) -> rs.toggleUniformity()); pragmaMap.put("subordinate", GrammarReader::subordinateGrammar); @@ -98,6 +105,46 @@ public class GrammarReader { pragmaMap.put("edit-sub-grammar", GrammarReader::editSubGrammar); pragmaMap.put("edit-parent", (stk, rs) -> rs.popGrammar()); pragmaMap.put("save-sub-grammar", GrammarReader::saveGrammar); + pragmaMap.put("debug", GrammarReader::debugGrammar); + pragmaMap.put("prefix-with", GrammarReader::prefixRule); + pragmaMap.put("suffix-with", GrammarReader::suffixRule); + pragmaMap.put("import-rule", GrammarReader::importRule); + } + + + private static void importRule(StringTokenizer stk, ReaderState rs) { + String ruleName = stk.nextToken(); + String sgName = stk.nextToken(); + + rs.getRules().addGrammarAlias(sgName, ruleName); + } + + private static void prefixRule(StringTokenizer stk, ReaderState rs) { + String rName = stk.nextToken(); + String prefixToken = stk.nextToken(); + int addProb = rs.isUniform() ? 0 + : Integer.parseInt(stk.nextToken()); + + rs.getRules().prefixRule(rName, prefixToken, addProb); + } + + private static void suffixRule(StringTokenizer stk, ReaderState rs) { + String rName = stk.nextToken(); + String prefixToken = stk.nextToken(); + int addProb = rs.isUniform() ? 0 + : Integer.parseInt(stk.nextToken()); + + rs.getRules().suffixRule(rName, prefixToken, addProb); + } + + private static void debugGrammar(StringTokenizer stk, ReaderState rs) { + System.out.println("Printing rule names: "); + + for (String rul : rs.getRules().ruleNames()) { + System.out.println("\t" + rul); + } + + System.out.println(); } private static void loadSubGrammar(StringTokenizer stk, @@ -120,6 +167,8 @@ public class GrammarReader { String rName = stk.nextToken(); WeightedGrammar<String> nwg = rs.getRules().getSubGrammar(gName); + rs.getRules().removeSubgrammar(gName); + nwg.addSubGrammar(rName, rs.getRules()); rs.setRules(nwg); } diff --git a/RGens/src/main/java/bjc/RGens/text/PragmaErrorException.java b/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java index 0f9cdc7..bede82a 100644 --- a/RGens/src/main/java/bjc/RGens/text/PragmaErrorException.java +++ b/RGens/src/main/java/bjc/RGens/parser/PragmaErrorException.java @@ -1,4 +1,4 @@ -package bjc.RGens.text; +package bjc.RGens.parser; public class PragmaErrorException extends RuntimeException { private static final long serialVersionUID = 7245421182038076899L; diff --git a/RGens/src/main/java/bjc/RGens/text/ReaderState.java b/RGens/src/main/java/bjc/RGens/parser/ReaderState.java index 1a2a36a..1487822 100644 --- a/RGens/src/main/java/bjc/RGens/text/ReaderState.java +++ b/RGens/src/main/java/bjc/RGens/parser/ReaderState.java @@ -1,47 +1,56 @@ -package bjc.RGens.text; +package bjc.RGens.parser; import java.util.Stack; import bjc.utils.gen.WeightedGrammar; public class ReaderState { - private Stack<WeightedGrammar<String>> wg = new Stack<WeightedGrammar<String>>(); - private String currRule = ""; - + // Pragma settings private boolean isUniform = false; - public void toggleUniformity() { - isUniform = !isUniform; + private Stack<WeightedGrammar<String>> wg; + + public ReaderState() { + wg = new Stack<WeightedGrammar<String>>(); + wg.push(new WeightedGrammar<>()); } - public boolean isUniform() { - return isUniform; + public WeightedGrammar<String> currGrammar() { + return wg.peek(); + } + + public String getRule() { + return currRule; } public WeightedGrammar<String> getRules() { return wg.peek(); } - public void setRule(String r) { - currRule = r; + public boolean isUniform() { + return isUniform; } - public String getRule() { - return currRule; + public WeightedGrammar<String> popGrammar() { + return wg.pop(); } - public void setRules(WeightedGrammar<String> nwg) { - wg.pop(); + public void pushGrammar(WeightedGrammar<String> nwg) { wg.push(nwg); } - public void pushGrammar(WeightedGrammar<String> nwg) { + public void setRule(String r) { + currRule = r; + } + + public void setRules(WeightedGrammar<String> nwg) { + wg.pop(); wg.push(nwg); } - public WeightedGrammar<String> popGrammar() { - return wg.pop(); + public void toggleUniformity() { + isUniform = !isUniform; } } diff --git a/RGens/src/main/java/bjc/RGens/text/UnknownPragmaException.java b/RGens/src/main/java/bjc/RGens/parser/UnknownPragmaException.java index d02e3c0..62d5b9f 100644 --- a/RGens/src/main/java/bjc/RGens/text/UnknownPragmaException.java +++ b/RGens/src/main/java/bjc/RGens/parser/UnknownPragmaException.java @@ -1,4 +1,4 @@ -package bjc.RGens.text; +package bjc.RGens.parser; import java.util.InputMismatchException; |
