From 5444cd4db8a0fa41d25cd303c1145cadd112e12f Mon Sep 17 00:00:00 2001 From: bjculkin Date: Tue, 21 Mar 2017 19:29:27 -0400 Subject: Add formatter Adds a formatter capable of taking in a parsed grammar and printing it out in a formatted form, capable of being reparsed. --- .../main/java/bjc/rgens/newparser/RGrammar.java | 45 ++++++++++++++++------ 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'RGens/src/main/java/bjc/rgens/newparser/RGrammar.java') diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java index 35fc356..3e82779 100644 --- a/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java +++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java @@ -114,18 +114,7 @@ public class RGrammar { state.contents.append(elm.getLiteral() + " "); break; case RULEREF: - if(rules.containsKey(elm.getLiteral())) { - RuleCase cse = rules.get(elm.getLiteral()).getCase(); - - generateCase(cse, state); - } else if(importRules.containsKey(elm.getLiteral())) { - RGrammar dst = importRules.get(elm.getLiteral()); - - state.contents.append(dst.generate(elm.getLiteral())); - } else { - throw new GrammarException( - String.format("No rule by name '%s' found", elm.getLiteral())); - } + generateRuleReference(elm, state); break; default: throw new GrammarException(String.format("Unknown element type '%s'", elm.type)); @@ -135,6 +124,29 @@ public class RGrammar { } } + /* + * Generate a rule reference. + */ + private void generateRuleReference(CaseElement elm, GenerationState state) { + String refersTo = elm.getLiteral(); + + GenerationState newState = new GenerationState(new StringBuilder()); + + if(rules.containsKey(refersTo)) { + RuleCase cse = rules.get(refersTo).getCase(); + + generateCase(cse, newState); + } else if(importRules.containsKey(refersTo)) { + RGrammar dst = importRules.get(refersTo); + + newState.contents.append(dst.generate(refersTo)); + } else { + throw new GrammarException(String.format("No rule by name '%s' found", refersTo)); + } + + state.contents.append(newState.contents.toString()); + } + /** * Get the initial rule of this grammar. * @@ -205,4 +217,13 @@ public class RGrammar { public void setExportedRules(Set exportRules) { this.exportRules = exportRules; } + + /** + * Get all the rules in this grammar. + * + * @return All the rules in this grammar. + */ + public Map getRules() { + return rules; + } } -- cgit v1.2.3