diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java')
| -rwxr-xr-x[-rw-r--r--] | src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java | 37 |
1 files changed, 35 insertions, 2 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..e58d073 100644..100755 --- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java @@ -1,7 +1,40 @@ package bjc.rgens.parser.elements; -public class ExpVariableCaseElement extends VariableCaseElement { +import bjc.utils.data.IPair; + +import bjc.rgens.parser.GenerationState; +import bjc.rgens.parser.GrammarException; +import bjc.rgens.parser.RecurLimitException; +import bjc.rgens.parser.RGrammar; +import bjc.rgens.parser.Rule; +import bjc.rgens.parser.RuleCase; + +public class ExpVariableCaseElement extends VariableDefCaseElement { public ExpVariableCaseElement(String name, String def) { - super(name, def, true); + super(name, def); + } + + @Override + public void generate(GenerationState state) { + GenerationState newState = state.newBuf(); + + Rule rl = state.findRule(varDef, true); + + if(rl != null) { + RGrammar destGrammar = rl.belongsTo; + newState.swapGrammar(destGrammar); + /* + * Don't post-process the string, we should only do that + * once. + */ + String res = destGrammar.generate(varDef, state, false); + + 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()); } } |
