diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-05-29 18:02:46 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-05-29 18:02:46 -0300 |
| commit | faf3e39fee32226ee72c6d43b2ba8a0f4e4bd837 (patch) | |
| tree | 900bdc5a803c7ac0d616d9ceb09e2293a6bd84ce /src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java | |
| parent | 986870048e06fa0de2dd81d244a78c43cd2aa769 (diff) | |
Refactor case element generation
Case elements are now responsible for generating themselves.
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java')
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java index 30925e2..8598fbd 100755 --- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java @@ -1,7 +1,45 @@ package bjc.rgens.parser.elements; +import bjc.rgens.parser.GenerationState; +import bjc.rgens.parser.GrammarException; +import bjc.rgens.parser.RGrammar; +import bjc.rgens.parser.RuleCase; + public class ExpVariableCaseElement extends VariableCaseElement { public ExpVariableCaseElement(String name, String def) { super(name, def, true); } + + @Override + public void generate(GenerationState state) { + GenerationState newState = state.newBuf(); + + if (state.rules.containsKey(varDef)) { + RuleCase destCase = state.rules.get(varDef).getCase(); + + state.gram.generateCase(destCase, newState); + } else if (state.importRules.containsKey(varDef)) { + RGrammar destGrammar = state.importRules.get(varDef); + + newState.swapGrammar(destGrammar); + + String res = destGrammar.generate(varDef, state); + + /* + * @NOTE + * + * :Postprocessing + * + * This is because generate() returns a processed + * string, but modifies the passed in StringBuilder. + */ + newState.contents = new StringBuilder(res); + } else { + String msg = String.format("No rule '%s' defined", varDef); + throw new GrammarException(msg); + } + + state.vars.put(varName, newState.contents.toString()); + + } } |
