summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/newparser/RGrammar.java
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2017-03-21 19:29:27 -0400
committerbjculkin <bjculkin@mix.wvu.edu>2017-03-21 19:38:42 -0400
commit5444cd4db8a0fa41d25cd303c1145cadd112e12f (patch)
tree779f205becc1e1cded6ed1c307f295a2404ce22d /RGens/src/main/java/bjc/rgens/newparser/RGrammar.java
parentccb2510fadf19e5e1cda63d948fd482e25fc799d (diff)
Add formatter
Adds a formatter capable of taking in a parsed grammar and printing it out in a formatted form, capable of being reparsed.
Diffstat (limited to 'RGens/src/main/java/bjc/rgens/newparser/RGrammar.java')
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammar.java45
1 files changed, 33 insertions, 12 deletions
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<String> exportRules) {
this.exportRules = exportRules;
}
+
+ /**
+ * Get all the rules in this grammar.
+ *
+ * @return All the rules in this grammar.
+ */
+ public Map<String, Rule> getRules() {
+ return rules;
+ }
}