summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 22:19:21 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 22:19:21 -0300
commit8062cff63f864178a2a73650870362871bc25224 (patch)
tree1da3005e66911182ae2433d7690fe98a0b8b6e37 /src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java
parent63c7fff30d41ab691d6f49d8d7b69e60f9a9e80f (diff)
Exhaustion pt. 2
There is now syntax for rule references. Use @ instead of $, and use := to indicate you want exhaustion enabled Use @ to refer to it
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java')
-rw-r--r--src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java
new file mode 100644
index 0000000..a7be1bb
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/elements/RuleVarRefCaseElement.java
@@ -0,0 +1,47 @@
+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;
+import bjc.rgens.parser.RGrammar;
+import bjc.rgens.parser.Rule;
+import bjc.rgens.parser.RuleCase;
+
+public class RuleVarRefCaseElement extends StringCaseElement {
+ public RuleVarRefCaseElement(String vl) {
+ super(vl, false);
+ }
+
+ public void generate(GenerationState state) {
+ if(!state.rlVars.containsKey(val)) {
+ throw new GrammarException("No rule variable named " + val);
+ }
+
+ IPair<RGrammar, Rule> par = state.rlVars.get(val);
+
+ GenerationState newState = state.newBuf();
+ newState.swapGrammar(par.getLeft());
+
+ if(par.getRight().doRecur()) {
+ RuleCase cse = par.getRight().getCase(state.rnd);
+ System.err.printf("\tFINE: Generating %s (from %s)\n", cse, par.getRight().name);
+
+ par.getLeft().generateCase(cse, newState);
+
+ par.getRight().endRecur();
+ } else {
+ throw new RecurLimitException("Rule recurrence limit exceeded");
+ }
+
+ String res = newState.contents.toString();
+
+ if (par.getRight().name.contains("+")) {
+ /* Rule names with pluses in them get space-flattened */
+ state.contents.append(res.replaceAll("\\s+", ""));
+ } else {
+ state.contents.append(res);
+ }
+ }
+}