summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-05 15:52:44 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-05 15:52:44 -0300
commitf25d1062a56a81b17348b799e6d4d7e1dc12a1cc (patch)
tree1e2966389381204cf799732742b135fa85fad923 /src/main/java/bjc/rgens/parser/elements
parent0164b842d14675b0a28dd143d36923e690e75d27 (diff)
Templates pt.2
More work that leads towards getting templates working
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java21
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/RangeCaseElement.java4
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/RuleCaseElement.java46
-rw-r--r--src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java31
4 files changed, 38 insertions, 64 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
index 455fce6..ae85139 100755
--- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
@@ -1,5 +1,7 @@
package bjc.rgens.parser.elements;
+import bjc.utils.data.IPair;
+
import bjc.rgens.parser.GenerationState;
import bjc.rgens.parser.GrammarException;
import bjc.rgens.parser.RecurLimitException;
@@ -16,24 +18,11 @@ public class ExpVariableCaseElement extends VariableCaseElement {
public void generate(GenerationState state) {
GenerationState newState = state.newBuf();
- if (state.rules.containsKey(varDef)) {
- Rule rl = state.rules.get(varDef);
-
- if(rl.doRecur()) {
- RuleCase destCase = state.rules.get(varDef).getCase();
- System.err.printf("\tFINE: Generating %s (from %s)\n", destCase, varDef);
-
- state.gram.generateCase(destCase, newState);
-
- rl.endRecur();
- } else {
- throw new RecurLimitException("Rule recurrence limit exceeded");
- }
- } else if (state.importRules.containsKey(varDef)) {
- RGrammar destGrammar = state.importRules.get(varDef);
+ IPair<RGrammar, Rule> par = state.findRule(varDef, true);
+ if(par != null) {
+ RGrammar destGrammar = par.getLeft();
newState.swapGrammar(destGrammar);
-
String res = destGrammar.generate(varDef, state);
/*
diff --git a/src/main/java/bjc/rgens/parser/elements/RangeCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RangeCaseElement.java
index 7cebde9..cf8f161 100755
--- a/src/main/java/bjc/rgens/parser/elements/RangeCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/RangeCaseElement.java
@@ -14,8 +14,8 @@ public class RangeCaseElement extends CaseElement {
}
public void generate(GenerationState state) {
- int val = state.rnd.nextInt(end - begin);
- val += begin;
+ int val = state.rnd.nextInt(end - begin);
+ val += begin;
state.contents.append(val);
}
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
index c299963..3e3d182 100755
--- a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
@@ -1,5 +1,8 @@
package bjc.rgens.parser.elements;
+import bjc.utils.data.IPair;
+import bjc.utils.data.Pair;
+
import bjc.rgens.parser.*;
import java.util.regex.Matcher;
@@ -23,35 +26,30 @@ public abstract class RuleCaseElement extends StringCaseElement {
protected void doGenerate(String actName, GenerationState state) {
GenerationState newState = state.newBuf();
+ IPair<RGrammar, Rule> par;
+
if (actName.startsWith("[^")) {
actName = "[" + actName.substring(2);
- RGrammar dst = state.importRules.get(actName);
-
- newState.swapGrammar(dst);
-
- /* :Postprocessing */
- newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars, state.rlVars));
- } else if (state.rules.containsKey(actName)) {
- Rule rl = state.rules.get(actName);
-
- if(rl.doRecur()) {
- RuleCase cse = rl.getCase(state.rnd);
- System.err.printf("\tFINE: Generating %s (from %s)\n", cse, actName);
-
- state.gram.generateCase(cse, newState);
-
- rl.endRecur();
- } else {
- throw new RecurLimitException("Rule recurrence limit exceeded");
- }
- } else if (state.importRules.containsKey(actName)) {
- RGrammar dst = state.importRules.get(actName);
+ par = state.findImport(actName);
+ } else {
+ par = state.findRule(actName, true);
+ }
- newState.swapGrammar(dst);
+ if(par != null) {
+ RGrammar destGrammar = par.getLeft();
+ newState.swapGrammar(destGrammar);
+ String res = destGrammar.generate(actName, newState);
- /* :Postprocessing */
- newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars, state.rlVars));
+ /*
+ * @NOTE
+ *
+ * :Postprocessing
+ *
+ * This is because generate() returns a processed
+ * string, but modifies the passed in StringBuilder.
+ */
+ newState.contents = new StringBuilder(res);
} else {
/*
* @TODO 5/29/18 Ben Culkin :RuleSuggesting
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
index d4c677b..fa1783f 100644
--- a/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
@@ -18,35 +18,22 @@ public class RuleVariableCaseElement extends VariableCaseElement {
}
public void generate(GenerationState state) {
- Rule rl;
- RGrammar grm;
-
- if(state.rules.containsKey(varDef)) {
- rl = state.rules.get(varDef);
- grm = state.gram;
- } else if(state.importRules.containsKey(varDef)) {
- grm = state.importRules.get(varDef);
- rl = grm.getRules().get(varDef);
- } else {
+ IPair<RGrammar, Rule> par = state.findRule(varDef, true);
+
+ if(par == null) {
throw new GrammarException("Can't create variable referencing non-existent rule " + varDef);
}
-
-
- if(exhaust) rl = rl.exhaust();
-
- if(state.rlVars.containsKey(varName)) {
- IPair<RGrammar, Rule> par = state.rlVars.get(varName);
-
- System.err.printf("WARN: Shadowing rule variable '%s' (%s with %s)\n",
- varName, par.getRight().name, rl.name);
+
+ if(exhaust) {
+ par = new Pair<>(par.getLeft(), par.getRight().exhaust());
}
- state.rlVars.put(varName, new Pair<>(grm, rl));
+ state.rlVars.put(varName, par);
if(exhaust) {
- System.err.printf("\t\tTRACE: Defined exhausted rulevar '%s' ('%s')\n", varName, varDef);
+ System.err.printf("\t\tFINE: Defined exhausted rulevar '%s' ('%s')\n", varName, varDef);
} else {
- System.err.printf("\t\tTRACE: Defined rulevar '%s' ('%s')\n", varName, varDef);
+ System.err.printf("\t\tFINE: Defined rulevar '%s' ('%s')\n", varName, varDef);
}
}
}