summaryrefslogtreecommitdiff
path: root/RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java
diff options
context:
space:
mode:
authorstudent <student@69.161.224.76>2018-03-29 11:38:02 -0400
committerstudent <student@69.161.224.76>2018-03-29 11:38:02 -0400
commit6aa15e30fa75211964428e386b4b6b0f2c66dbc5 (patch)
tree5beeb6016a94b284eeed80daf65b9c2800ec7e63 /RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java
parentc921b00c99cf46bc33f724581ab9bde2b0d8bb6a (diff)
Rename package
Diffstat (limited to 'RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java')
-rw-r--r--RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java96
1 files changed, 96 insertions, 0 deletions
diff --git a/RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java b/RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java
new file mode 100644
index 0000000..96bdee8
--- /dev/null
+++ b/RGens/src/main/java/bjc/rgens/parser/RGrammarFormatter.java
@@ -0,0 +1,96 @@
+package bjc.rgens.parser;
+
+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.name)) {
+ sb.append("\n\n");
+
+ processRule(rule, sb);
+ }
+
+ processedRules.add(rule.name);
+ }
+
+ return sb.toString().trim();
+ }
+
+ /* Format a rule. */
+ private static void processRule(Rule rule, StringBuilder sb) {
+ IList<RuleCase> cases = rule.getCases();
+
+ StringBuilder ruleBuilder = new StringBuilder();
+
+ ruleBuilder.append(rule.name);
+ 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();
+ }
+
+ }
+
+ /* Format a case. */
+ 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);
+ }
+}