From 9b9ce0c3123d70b9e839084aade4f37eb08e328d Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Mon, 4 Jun 2018 21:13:50 -0300 Subject: Rule variables pt. 1 Add the capability to store regular/exhaustible rule variables --- src/main/java/bjc/rgens/parser/GenerationState.java | 10 ++++++---- src/main/java/bjc/rgens/parser/RGrammar.java | 6 +++--- src/main/java/bjc/rgens/parser/Rule.java | 20 ++++++++++++++++++++ .../bjc/rgens/parser/elements/RuleCaseElement.java | 2 +- 4 files changed, 30 insertions(+), 8 deletions(-) (limited to 'src/main/java/bjc/rgens/parser') diff --git a/src/main/java/bjc/rgens/parser/GenerationState.java b/src/main/java/bjc/rgens/parser/GenerationState.java index 7ab55bf..78fce96 100644 --- a/src/main/java/bjc/rgens/parser/GenerationState.java +++ b/src/main/java/bjc/rgens/parser/GenerationState.java @@ -33,6 +33,7 @@ public class GenerationState { */ /** The current set of variables. */ public Map vars; + public Map rlVars; /** * Create a new generation state. @@ -46,10 +47,11 @@ public class GenerationState { * @param vs * The variables to use. */ - public GenerationState(StringBuilder cont, Random rand, Map vs, RGrammar gram) { + public GenerationState(StringBuilder cont, Random rand, Map vs, Map rvs, RGrammar gram) { contents = cont; - rnd = rand; - vars = vs; + rnd = rand; + vars = vs; + rlVars = rvs; this.gram = gram; @@ -66,6 +68,6 @@ public class GenerationState { } public GenerationState newBuf() { - return new GenerationState(new StringBuilder(), rnd, vars, gram); + return new GenerationState(new StringBuilder(), rnd, vars, rlVars, gram); } } diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java index bd289e9..6b17173 100755 --- a/src/main/java/bjc/rgens/parser/RGrammar.java +++ b/src/main/java/bjc/rgens/parser/RGrammar.java @@ -108,7 +108,7 @@ public class RGrammar { * @return A possible string from the grammar. */ public String generate(String startRule) { - return generate(startRule, new Random(), new HashMap<>()); + return generate(startRule, new Random(), new HashMap<>(), new HashMap<>()); } /** @@ -126,8 +126,8 @@ public class RGrammar { * * @return A possible string from the grammar. */ - public String generate(String startRule, Random rnd, Map vars) { - return generate(startRule, new GenerationState(new StringBuilder(), rnd, vars, this)); + public String generate(String startRule, Random rnd, Map vars, Map rlVars) { + return generate(startRule, new GenerationState(new StringBuilder(), rnd, vars, rlVars, this)); } /** diff --git a/src/main/java/bjc/rgens/parser/Rule.java b/src/main/java/bjc/rgens/parser/Rule.java index 3e7d884..b5a87c3 100755 --- a/src/main/java/bjc/rgens/parser/Rule.java +++ b/src/main/java/bjc/rgens/parser/Rule.java @@ -199,4 +199,24 @@ public class Rule { public void endRecur() { if(currentRecur > 0) currentRecur -= 1; } + + public Rule exhaust() { + Rule rl = new Rule(name); + + rl.cases = cases.exhaustible(); + + rl.prob = prob; + + rl.descentFactor = descentFactor; + + rl.target = target; + rl.bound = bound; + rl.trials = trials; + + rl.recurLimit = recurLimit; + /* @NOTE Is this the right thing to do? */ + rl.currentRecur = 0; + + return rl; + } } diff --git a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java index 66c0296..c299963 100755 --- a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java @@ -51,7 +51,7 @@ public abstract class RuleCaseElement extends StringCaseElement { newState.swapGrammar(dst); /* :Postprocessing */ - newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars)); + newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars, state.rlVars)); } else { /* * @TODO 5/29/18 Ben Culkin :RuleSuggesting -- cgit v1.2.3