From 15f0bf5207df703ffbb53c18a147b440dcf43546 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Wed, 5 Sep 2018 14:54:12 -0300 Subject: 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 --- .../java/bjc/rgens/parser/GenerationState.java | 37 +++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'src/main/java/bjc/rgens/parser/GenerationState.java') 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 rules; + private Map rules; /** The rules imported from other grammars. */ - public Map importRules; + private Map importRules; /** The current set of variables. */ - public MapSet vars; - public MapSet rlVars; + private MapSet vars; + private MapSet 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); + } } -- cgit v1.2.3