diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java')
| -rw-r--r-- | src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java | 46 |
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)); + } +} |
