From 8062cff63f864178a2a73650870362871bc25224 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Mon, 4 Jun 2018 22:19:21 -0300 Subject: 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 --- .../parser/elements/RuleVariableCaseElement.java | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java (limited to 'src/main/java/bjc/rgens/parser/elements/RuleVariableCaseElement.java') 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 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)); + } +} -- cgit v1.2.3