summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.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/RGrammarFormatter.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/RGrammarFormatter.java')
-rw-r--r--RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.java b/RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.java
new file mode 100644
index 0000000..231e191
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.java
@@ -0,0 +1,98 @@
+package bjc.rgens.newparser;
+
+import bjc.utils.funcdata.IList;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Format randomized grammars to strings properly.
+ *
+ * @author EVE
+ *
+ */
+public class RGrammarFormatter {
+ /**
+ * Format a grammar into a file that represents that grammar.
+ *
+ * @param gram
+ * The grammar to format.
+ *
+ * @return The formatted grammar.
+ */
+ public static String formatGrammar(RGrammar gram) {
+ StringBuilder sb = new StringBuilder();
+
+ Map<String, Rule> rules = gram.getRules();
+
+ String initRuleName = gram.getInitialRule();
+
+ Set<String> processedRules = new HashSet<>();
+
+ if(initRuleName != null) {
+ processRule(rules.get(initRuleName), sb);
+
+ processedRules.add(initRuleName);
+ }
+
+ for(Rule rule : rules.values()) {
+ if(!processedRules.contains(rule.ruleName)) {
+ sb.append("\n\n");
+
+ processRule(rule, sb);
+ }
+
+ processedRules.add(rule.ruleName);
+ }
+
+ return sb.toString().trim();
+ }
+
+ private static void processRule(Rule rule, StringBuilder sb) {
+ IList<RuleCase> cases = rule.getCases();
+
+ StringBuilder ruleBuilder = new StringBuilder();
+
+ ruleBuilder.append(rule.ruleName);
+ ruleBuilder.append(" \u2192 ");
+
+ int markerPos = ruleBuilder.length();
+
+ processCase(cases.first(), ruleBuilder);
+
+ sb.append(ruleBuilder.toString().trim());
+
+ ruleBuilder = new StringBuilder();
+
+ for(RuleCase cse : cases.tail()) {
+ sb.append("\n\t");
+
+ for(int i = 8; i < markerPos; i++) {
+ ruleBuilder.append(" ");
+ }
+
+ processCase(cse, ruleBuilder);
+
+ sb.append(ruleBuilder.toString());
+
+ ruleBuilder = new StringBuilder();
+ }
+
+ }
+
+ private static void processCase(RuleCase cse, StringBuilder sb) {
+ /*
+ * Process each element, adding a space.
+ */
+ for(CaseElement element : cse.getElements()) {
+ sb.append(element.toString());
+ sb.append(" ");
+ }
+
+ /*
+ * Remove the trailing space.
+ */
+ sb.deleteCharAt(sb.length() - 1);
+ }
+}