diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-03 23:59:30 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-04 00:01:28 -0300 |
| commit | 5c416488ef63b5004ca424de56894eb17712f116 (patch) | |
| tree | b16cb41e704f8046ce75d094bfe5968116d93dfe /src/main/java/bjc/rgens/parser/elements | |
| parent | 63aaf20560a2c4037cab8a7ef5fd6251d6036a2d (diff) | |
Add recurrance limit
This controls the number of times a rule can be entered into during a
single generations, and is set to 5 by default
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements')
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java | 15 | ||||
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java | 28 |
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); |
