diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java')
| -rwxr-xr-x[-rw-r--r--] | src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java | 100 |
1 files changed, 98 insertions, 2 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java index f4d3512..f13dbdb 100644..100755 --- a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java @@ -1,7 +1,103 @@ package bjc.rgens.parser.elements; -public class RuleCaseElement extends StringCaseElement { +import bjc.utils.data.IPair; +import bjc.utils.data.Pair; + +import bjc.rgens.parser.*; +import bjc.rgens.parser.elements.vars.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class RuleCaseElement extends CaseElement { + public List<VariableElement> elements; + public RuleCaseElement(String vl) { - super(vl, false); + super(true); + + this.elements = VariableElement.parseElementString(vl); + } + + public RuleCaseElement(String vl, List<VariableElement> elements) { + super(true); + + this.elements = elements; + } + + public void generate(GenerationState state) { + GenerationState newState = state.newBuf(); + + boolean inName = false; + + for(VariableElement elm : elements) { + elm.generate(newState); + + if(inName == false) inName = elm.forbidSpaces; + } + + String body = newState.contents.toString(); + + if(inName) { + doGenerate(String.format("[%s]", body), state); + } else { + state.contents.append(body); + } + } + + protected void doGenerate(String actName, GenerationState state) { + GenerationState newState = state.newBuf(); + + Rule rl; + + if (actName.startsWith("[^")) { + actName = "[" + actName.substring(2); + + rl = state.findImport(actName); + } else { + rl = state.findRule(actName, true); + } + + if(rl != null) { + RGrammar destGrammar = rl.belongsTo; + newState.swapGrammar(destGrammar); + /* + * Don't postprocess the string, we should only do that + * once. + */ + String res = destGrammar.generate(actName, newState, false); + newState.contents = new StringBuilder(res); + } else { + /* + * @TODO 5/29/18 Ben Culkin :RuleSuggesting + * + * Re-get this working again. + */ + /* + if (ruleSearcher != null) { + Set<Match<? extends String>> results = ruleSearcher.search(actName, MAX_DISTANCE); + + String[] resArray = results.stream().map(Match::getMatch).toArray((i) -> new String[i]); + + String msg = String.format("No rule '%s' defined (perhaps you meant %s?)", actName, + StringUtils.toEnglishList(resArray, false)); + + throw new GrammarException(msg); + } + */ + + String msg = String.format("No rule '%s' defined", actName); + throw new GrammarException(msg); + } + + String res = newState.contents.toString(); + + if (actName.contains("+")) { + /* Rule names with pluses in them get space-flattened */ + state.contents.append(res.replaceAll("\\s+", "")); + } else { + state.contents.append(res); + } } } |
