summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc
diff options
context:
space:
mode:
Diffstat (limited to 'RGens/src/main/java/bjc')
-rw-r--r--RGens/src/main/java/bjc/RGens/ZadronsPouch.java28
-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;