diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements')
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); } } } |
