summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-29 19:44:40 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-05-29 19:44:40 -0300
commitc524f46dbd6a460b7374690244888a001023d3af (patch)
tree8dff50b09354027879fe9b3c74c4dfc8274f25c6 /src/main
parente7c2ce4ba9bd684a6722baf9ce58e91dfacc8eb3 (diff)
Refactor to split RuleCase
RuleCase now handles its own generation.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/bjc/rgens/parser/FlatRuleCase.java19
-rw-r--r--src/main/java/bjc/rgens/parser/NormalRuleCase.java22
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammar.java30
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammarBuilder.java6
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammarParser.java2
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RegexRuleCase.java6
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RuleCase.java6
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/CaseElement.java16
8 files changed, 66 insertions, 41 deletions
diff --git a/src/main/java/bjc/rgens/parser/FlatRuleCase.java b/src/main/java/bjc/rgens/parser/FlatRuleCase.java
new file mode 100644
index 0000000..58f3d54
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/FlatRuleCase.java
@@ -0,0 +1,19 @@
+package bjc.rgens.parser;
+
+import bjc.utils.funcdata.IList;
+
+import bjc.rgens.parser.elements.CaseElement;
+
+public class FlatRuleCase extends RuleCase {
+ public FlatRuleCase(IList<CaseElement> elms) {
+ super(CaseType.SPACEFLATTEN, elms);
+ }
+
+ @Override
+ public void generate(GenerationState state) {
+ for(CaseElement elm : elementList) {
+ elm.generate(state);
+ }
+ }
+}
+
diff --git a/src/main/java/bjc/rgens/parser/NormalRuleCase.java b/src/main/java/bjc/rgens/parser/NormalRuleCase.java
new file mode 100644
index 0000000..19fa8af
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/NormalRuleCase.java
@@ -0,0 +1,22 @@
+package bjc.rgens.parser;
+
+import bjc.utils.funcdata.IList;
+
+import bjc.rgens.parser.elements.CaseElement;
+
+public class NormalRuleCase extends RuleCase {
+ public NormalRuleCase(IList<CaseElement> elms) {
+ super(CaseType.NORMAL, elms);
+ }
+
+ @Override
+ public void generate(GenerationState state) {
+ for(CaseElement elm : elementList) {
+ elm.generate(state);
+
+ if(elm.type.spacing) {
+ state.contents.append(" ");
+ }
+ }
+ }
+}
diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java
index 9d17171..4e21279 100755
--- a/src/main/java/bjc/rgens/parser/RGrammar.java
+++ b/src/main/java/bjc/rgens/parser/RGrammar.java
@@ -221,41 +221,13 @@ public class RGrammar {
*/
public void generateCase(RuleCase start, GenerationState state) {
try {
- switch (start.type) {
- case NORMAL:
- for (CaseElement elm : start.getElements()) {
- generateElement(elm, state);
-
- if (elm.type != CaseElement.ElementType.VARDEF) {
- state.contents.append(" ");
- }
- }
- break;
- case SPACEFLATTEN:
- for (CaseElement elm : start.getElements()) {
- generateElement(elm, state);
- }
- break;
- default:
- String msg = String.format("Unknown case type '%s'", start.type);
- throw new GrammarException(msg);
- }
+ start.generate(state);
} catch (GrammarException gex) {
String msg = String.format("Error in generating case (%s)", start);
throw new GrammarException(msg, gex);
}
}
- /* Generate a case element. */
- private void generateElement(CaseElement elm, GenerationState state) {
- try {
- elm.generate(state);
- } catch (GrammarException gex) {
- String msg = String.format("Error in generating case element (%s)", elm);
- throw new GrammarException(msg, gex);
- }
- }
-
/**
* Get the initial rule of this grammar.
*
diff --git a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
index f34a418..fc679f1 100755
--- a/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
+++ b/src/main/java/bjc/rgens/parser/RGrammarBuilder.java
@@ -167,7 +167,7 @@ public class RGrammarBuilder {
* Is this correct, or should we be mirroring the
* existing case type?
*/
- newCases.add(new RuleCase(NORMAL, newCase));
+ newCases.add(new NormalRuleCase(newCase));
}
@@ -220,7 +220,7 @@ public class RGrammarBuilder {
* Is this correct, or should we be mirroring the
* existing case type?
*/
- newCases.add(new RuleCase(NORMAL, newCase));
+ newCases.add(new NormalRuleCase(newCase));
}
@@ -243,7 +243,7 @@ public class RGrammarBuilder {
IList<RuleCase> newCaseList = new FunctionalList<>();
for(RuleCase cse : caseList) {
- newCaseList.add(new RuleCase(SPACEFLATTEN, cse.getElements()));
+ newCaseList.add(new FlatRuleCase(cse.getElements()));
}
rules.get(ruleName).replaceCases(newCaseList);
diff --git a/src/main/java/bjc/rgens/parser/RGrammarParser.java b/src/main/java/bjc/rgens/parser/RGrammarParser.java
index 506256d..5a09ca8 100755
--- a/src/main/java/bjc/rgens/parser/RGrammarParser.java
+++ b/src/main/java/bjc/rgens/parser/RGrammarParser.java
@@ -347,7 +347,7 @@ public class RGrammarParser {
caseParts.add(CaseElement.createElement(partToAdd));
}
- rul.addCase(new RuleCase(RuleCase.CaseType.NORMAL, caseParts));
+ rul.addCase(new NormalRuleCase(caseParts));
}
/* Handle a where block (a block with local rules). */
diff --git a/src/main/java/bjc/rgens/parser/RegexRuleCase.java b/src/main/java/bjc/rgens/parser/RegexRuleCase.java
index 5e03cd6..3a8a8ad 100755
--- a/src/main/java/bjc/rgens/parser/RegexRuleCase.java
+++ b/src/main/java/bjc/rgens/parser/RegexRuleCase.java
@@ -10,7 +10,7 @@ public class RegexRuleCase extends RuleCase {
private Pattern patt;
public RegexRuleCase(IList<CaseElement> elements, String pattern) {
- super(RuleCase.CaseType.REGEX);
+ super(CaseType.REGEX, elements);
elementList = elements;
@@ -29,4 +29,8 @@ public class RegexRuleCase extends RuleCase {
public Pattern getPattern() {
return patt;
}
+
+ public void generate(GenerationState state) {
+
+ }
}
diff --git a/src/main/java/bjc/rgens/parser/RuleCase.java b/src/main/java/bjc/rgens/parser/RuleCase.java
index 9c0a856..bb82ff2 100755
--- a/src/main/java/bjc/rgens/parser/RuleCase.java
+++ b/src/main/java/bjc/rgens/parser/RuleCase.java
@@ -13,7 +13,7 @@ import bjc.utils.funcdata.IList;
*
* @author EVE
*/
-public class RuleCase {
+public abstract class RuleCase {
/**
* The possible types of a case.
*
@@ -25,7 +25,7 @@ public class RuleCase {
/** A case that doesn't insert spaces. */
SPACEFLATTEN,
/** A case that applies a regex after generation. */
- REGEX
+ REGEX;
}
/** The type of this case. */
@@ -75,6 +75,8 @@ public class RuleCase {
elementList = elements;
}
+ public abstract void generate(GenerationState state);
+
/**
* Get the element list value of this type.
*
diff --git a/src/main/java/bjc/rgens/parser/elements/CaseElement.java b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
index cc04781..54c673f 100755
--- a/src/main/java/bjc/rgens/parser/elements/CaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
@@ -16,18 +16,24 @@ public abstract class CaseElement {
*/
public static enum ElementType {
/** An element that represents a literal string. */
- LITERAL,
+ LITERAL(true),
/** An element that represents a rule reference. */
- RULEREF,
+ RULEREF(true),
/** An element that represents a random range. */
- RANGE,
+ RANGE(true),
/** An element that represents a variable that stores a string. */
- VARDEF,
+ VARDEF(false),
/**
* An element that represents a variable that stores the result of generating a
* rule.
*/
- EXPVARDEF;
+ EXPVARDEF(false);
+
+ public final boolean spacing;
+
+ private ElementType(boolean spacing) {
+ this.spacing = spacing;
+ }
}
/* Regexps for marking rule types. */