diff options
| author | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 19:29:27 -0400 |
|---|---|---|
| committer | bjculkin <bjculkin@mix.wvu.edu> | 2017-03-21 19:38:42 -0400 |
| commit | 5444cd4db8a0fa41d25cd303c1145cadd112e12f (patch) | |
| tree | 779f205becc1e1cded6ed1c307f295a2404ce22d /RGens/src/main/java/bjc/rgens/newparser/RGrammarFormatter.java | |
| parent | ccb2510fadf19e5e1cda63d948fd482e25fc799d (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.java | 98 |
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); + } +} |
