diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-09-05 14:54:12 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-09-05 14:54:12 -0300 |
| commit | 15f0bf5207df703ffbb53c18a147b440dcf43546 (patch) | |
| tree | 587a58ae6a09a2c63af6f62111211e029f868b05 | |
| parent | dee4d326c7ab5b353813877e452cd72103e644b0 (diff) | |
Make variable fields private
This makes the two maps in GenerationState private. Use the
defineVar/findVar or defineRuleVar/findRuleVar instead.
This is another change on the way to doing autovivify
6 files changed, 38 insertions, 16 deletions
diff --git a/src/main/java/bjc/rgens/parser/GenerationState.java b/src/main/java/bjc/rgens/parser/GenerationState.java index 382fba3..ebe7ca4 100644 --- a/src/main/java/bjc/rgens/parser/GenerationState.java +++ b/src/main/java/bjc/rgens/parser/GenerationState.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Random; +import static bjc.rgens.parser.RGrammarLogging.*; /* * The current state during generation. * @@ -21,13 +22,13 @@ public class GenerationState { /** The current grammar. */ public RGrammar gram; /** The rules of the grammar. */ - public Map<String, Rule> rules; + private Map<String, Rule> rules; /** The rules imported from other grammars. */ - public Map<String, Rule> importRules; + private Map<String, Rule> importRules; /** The current set of variables. */ - public MapSet<String, String> vars; - public MapSet<String, Rule> rlVars; + private MapSet<String, String> vars; + private MapSet<String, Rule> rlVars; private static final Random BASE = new Random(); @@ -109,4 +110,32 @@ public class GenerationState { return null; } + + public void defineVar(String name, String val) { + if(vars.containsKey(name)) + warn("Shadowing variable %s with value %s (old value %s)", name, vars.get(name), val); + + vars.put(name, val); + } + + public void defineRuleVar(String name, Rule rle) { + if(rlVars.containsKey(name)) + warn("Shadowing rule variable %s with value %s (old value %s)", name, rlVars.get(name), rle); + + rlVars.put(name, rle); + } + + public String findVar(String name, GenerationState stat) { + if(!vars.containsKey(name)) + throw new GrammarException(String.format("Variable %s not defined", name)); + + return vars.get(name); + } + + public Rule findRuleVar(String name, GenerationState stat) { + if(!rlVars.containsKey(name)) + throw new GrammarException(String.format("Rule variable %s not defined", name)); + + return rlVars.get(name); + } } diff --git a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java index e58d073..1606e59 100755 --- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java @@ -35,6 +35,6 @@ public class ExpVariableCaseElement extends VariableDefCaseElement { throw new GrammarException(msg); } - state.vars.put(varName, newState.contents.toString()); + state.defineVar(varName, newState.contents.toString()); } } diff --git a/src/main/java/bjc/rgens/parser/elements/LitVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/LitVariableCaseElement.java index 3c6ba98..c5e5c6f 100755 --- a/src/main/java/bjc/rgens/parser/elements/LitVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/LitVariableCaseElement.java @@ -8,6 +8,6 @@ public class LitVariableCaseElement extends VariableDefCaseElement { } public void generate(GenerationState state) { - state.vars.put(varName, varDef); + state.defineVar(varName, varDef); } } diff --git a/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java index d11915e..a7fdbec 100644 --- a/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java @@ -30,7 +30,7 @@ public class RuleVariableCaseElement extends VariableDefCaseElement { rl = rl.exhaust(); } - state.rlVars.put(varName, rl); + state.defineRuleVar(varName, rl); if(exhaust) { fine("Defined exhausted rulevar '%s' ('%s')", varName, varDef); diff --git a/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java index a4bb730..5e8fe05 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java @@ -14,11 +14,7 @@ public class ARefVariableElement extends VariableElement { } public void generate(GenerationState state) { - if(!state.rlVars.containsKey(value)) { - throw new GrammarException("No rule variable named " + value); - } - - Rule rl = state.rlVars.get(value); + Rule rl = state.findRuleVar(value, state); GenerationState newState = state.newBuf(); diff --git a/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java b/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java index b19f785..a16503f 100644 --- a/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java +++ b/src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java @@ -13,11 +13,8 @@ public class VRefVariableElement extends VariableElement { } public void generate(GenerationState state) { - if (!state.vars.containsKey(nam)) { - throw new GrammarException(String.format("No variable '%s' defined", nam)); - } + String strang = state.findVar(nam, state); - String strang = state.vars.get(nam); if(forbidSpaces && strang.contains(" ")) { throw new GrammarException(String.format("Cannot include variable %s w/ spaces in body in rule name", nam)); } |
