summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java15
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/RuleCaseElement.java28
2 files changed, 30 insertions, 13 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
index 8598fbd..9c5ad1b 100755
--- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java
@@ -2,7 +2,9 @@ package bjc.rgens.parser.elements;
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 ExpVariableCaseElement extends VariableCaseElement {
@@ -15,9 +17,17 @@ public class ExpVariableCaseElement extends VariableCaseElement {
GenerationState newState = state.newBuf();
if (state.rules.containsKey(varDef)) {
- RuleCase destCase = state.rules.get(varDef).getCase();
+ Rule rl = state.rules.get(varDef);
- state.gram.generateCase(destCase, newState);
+ if(rl.doRecur()) {
+ RuleCase destCase = state.rules.get(varDef).getCase();
+
+ 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);
@@ -40,6 +50,5 @@ public class ExpVariableCaseElement extends VariableCaseElement {
}
state.vars.put(varName, newState.contents.toString());
-
}
}
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
index b4a4b58..0869a2f 100755
--- a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java
@@ -33,9 +33,17 @@ public abstract class RuleCaseElement extends StringCaseElement {
/* :Postprocessing */
newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars));
} else if (state.rules.containsKey(actName)) {
- RuleCase cse = state.rules.get(actName).getCase(state.rnd);
+ Rule rl = state.rules.get(actName);
- state.gram.generateCase(cse, newState);
+ if(rl.doRecur()) {
+ RuleCase cse = rl.getCase(state.rnd);
+
+ 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);
@@ -50,17 +58,17 @@ public abstract class RuleCaseElement extends StringCaseElement {
* Re-get this working again.
*/
/*
- if (ruleSearcher != null) {
- Set<Match<? extends String>> results = ruleSearcher.search(actName, MAX_DISTANCE);
+ if (ruleSearcher != null) {
+ Set<Match<? extends String>> results = ruleSearcher.search(actName, MAX_DISTANCE);
- String[] resArray = results.stream().map(Match::getMatch).toArray((i) -> new String[i]);
+ String[] resArray = results.stream().map(Match::getMatch).toArray((i) -> new String[i]);
- String msg = String.format("No rule '%s' defined (perhaps you meant %s?)", actName,
- StringUtils.toEnglishList(resArray, false));
+ String msg = String.format("No rule '%s' defined (perhaps you meant %s?)", actName,
+ StringUtils.toEnglishList(resArray, false));
- throw new GrammarException(msg);
- }
- */
+ throw new GrammarException(msg);
+ }
+ */
String msg = String.format("No rule '%s' defined", actName);
throw new GrammarException(msg);