summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/Rule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/Rule.java')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/Rule.java26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/main/java/bjc/rgens/parser/Rule.java b/src/main/java/bjc/rgens/parser/Rule.java
index 06dedac..ac67158 100755
--- a/src/main/java/bjc/rgens/parser/Rule.java
+++ b/src/main/java/bjc/rgens/parser/Rule.java
@@ -13,6 +13,8 @@ import java.util.Random;
* @author EVE
*/
public class Rule {
+ public RGrammar belongsTo;
+
/** The name of this grammar rule. */
public String name;
@@ -83,7 +85,7 @@ public class Rule {
throw new NullPointerException("Case must not be null");
}
- cse.belongsTo = name;
+ cse.belongsTo = this;
cse.debugName = String.format("%s-%d", name, serial);
serial += 1;
@@ -143,7 +145,7 @@ public class Rule {
for(IPair<Integer, RuleCase> cse : cases) {
RuleCase cs = cse.getRight();
- cs.belongsTo = name;
+ cs.belongsTo = this;
cs.debugName = String.format("%s-%d", name, serial);
serial += 1;
@@ -203,6 +205,8 @@ public class Rule {
public Rule exhaust() {
Rule rl = new Rule(name);
+ rl.belongsTo = belongsTo;
+
rl.cases = cases.exhaustible();
rl.prob = prob;
@@ -219,4 +223,22 @@ public class Rule {
return rl;
}
+
+ public void generate(GenerationState state) {
+ state.swapGrammar(belongsTo);
+
+ if(doRecur()) {
+ RuleCase cse = getCase(state.rnd);
+
+ System.err.printf("\tFINE: Generating %s (from %s)\n", cse, belongsTo.name);
+
+ belongsTo.generateCase(cse, state);
+
+ endRecur();
+ }
+
+ if(name.contains("+")) {
+ state.contents = new StringBuilder(state.contents.toString().replaceAll("\\s+", ""));
+ }
+ }
}