summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-09-05 14:54:12 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-09-05 14:54:12 -0300
commit15f0bf5207df703ffbb53c18a147b440dcf43546 (patch)
tree587a58ae6a09a2c63af6f62111211e029f868b05
parentdee4d326c7ab5b353813877e452cd72103e644b0 (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
-rw-r--r--src/main/java/bjc/rgens/parser/GenerationState.java37
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java2
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/LitVariableCaseElement.java2
-rw-r--r--src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java2
-rw-r--r--src/main/java/bjc/rgens/parser/elements/vars/ARefVariableElement.java6
-rw-r--r--src/main/java/bjc/rgens/parser/elements/vars/VRefVariableElement.java5
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));
}