summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 22:19:21 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 22:19:21 -0300
commit8062cff63f864178a2a73650870362871bc25224 (patch)
tree1da3005e66911182ae2433d7690fe98a0b8b6e37 /src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
parent63c7fff30d41ab691d6f49d8d7b69e60f9a9e80f (diff)
Exhaustion pt. 2
There is now syntax for rule references. Use @ instead of $, and use := to indicate you want exhaustion enabled Use @ to refer to it
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java')
-rw-r--r--src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
new file mode 100644
index 0000000..55a1c1e
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java
@@ -0,0 +1,46 @@
+package bjc.rgens.parser.elements;
+
+import bjc.utils.data.IPair;
+import bjc.utils.data.Pair;
+
+import bjc.rgens.parser.GrammarException;
+import bjc.rgens.parser.GenerationState;
+import bjc.rgens.parser.Rule;
+import bjc.rgens.parser.RGrammar;
+
+public class RuleVariableCaseElement extends VariableCaseElement {
+ public final boolean exhaust;
+
+ public RuleVariableCaseElement(String varName, String varDef, boolean exhaust) {
+ super(varName, varDef, VariableType.RULE);
+
+ this.exhaust = exhaust;
+ }
+
+ 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 {
+ 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);
+ }
+
+ state.rlVars.put(varName, new Pair<>(grm, rl));
+ }
+}