summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/RGrammar.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/RGrammar.java')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammar.java25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java
index 5ca26a4..d523479 100755
--- a/src/main/java/bjc/rgens/parser/RGrammar.java
+++ b/src/main/java/bjc/rgens/parser/RGrammar.java
@@ -58,7 +58,7 @@ public class RGrammar {
/* The rules of the grammar. */
public Map<String, Rule> rules;
/* The rules imported from other grammars. */
- private Map<String, RGrammar> importRules;
+ private Map<String, Rule> importRules;
/* The rules exported from this grammar. */
private Set<String> exportRules;
/* The initial rule of this grammar. */
@@ -75,6 +75,10 @@ public class RGrammar {
*/
public RGrammar(Map<String, Rule> ruls) {
rules = ruls;
+
+ for(Rule rl : ruls.values()) {
+ rl.belongsTo = this;
+ }
}
/**
@@ -86,7 +90,7 @@ public class RGrammar {
* @param importedRules
* The set of imported rules to use.
*/
- public void setImportedRules(Map<String, RGrammar> importedRules) {
+ public void setImportedRules(Map<String, Rule> importedRules) {
importRules = importedRules;
}
@@ -131,7 +135,7 @@ public class RGrammar {
* @return A possible string from the grammar.
*/
public String generate(String startRule, Random rnd, Map<String, String> vars,
- Map<String, IPair<RGrammar, Rule>> rlVars) {
+ Map<String, Rule> rlVars) {
return generate(startRule, new GenerationState(new StringBuilder(), rnd, vars, rlVars, this));
}
@@ -164,20 +168,13 @@ public class RGrammar {
* We don't search imports, so it will always belong to this
* grammar.
*/
- Rule rl = state.findRule(fromRule, false).getRight();
+ Rule rl = state.findRule(fromRule, false);
+
if(rl == null)
throw new GrammarException("Could not find rule " + rl.name);
- if(rl.doRecur()) {
- RuleCase start = rl.getCase(state.rnd);
- System.err.printf("\tFINE: Generating %s (from %s in %s)\n", start, fromRule, name);
+ rl.generate(state);
- generateCase(start, state);
-
- rl.endRecur();
- } else {
- throw new RecurLimitException("Rule recurrence limit exceeded");
- }
/*
* @NOTE
*
@@ -326,7 +323,7 @@ public class RGrammar {
return rules;
}
- public Map<String, RGrammar> getImportRules() {
+ public Map<String, Rule> getImportRules() {
return importRules;
}
}