summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-03 20:00:46 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-03 20:00:46 -0300
commitaea83f40c087ee32cbc1ad4e7940d53f887fbff8 (patch)
treee8213d170022a54fa6529b92fda7b07998f00020 /src/main/java/bjc/rgens
parenta13f1f396d28c0b900a10bede57f30be3a35003a (diff)
Add inline case elements
This adds inline case elements, essentially cutting down on the need for short 2-3 alternative rules. You'll still need explicit rules for things involving spaces though. Perhaps I will add a quoting feature to solve that problem.
Diffstat (limited to 'src/main/java/bjc/rgens')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/CaseElement.java2
-rw-r--r--src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java24
2 files changed, 26 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/CaseElement.java b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
index 785ac1a..d7889a9 100755
--- a/src/main/java/bjc/rgens/parser/elements/CaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
@@ -118,6 +118,8 @@ public abstract class CaseElement {
} else if (specialBody.matches("empty")) {
/* Literal blank, for empty cases. */
return new BlankCaseElement();
+ } else if (specialBody.contains("|")) {
+ return new InlineRuleCaseElement(specialBody.split("|"));
} else {
throw new IllegalArgumentException(String.format("Unknown special case part '%s'", specialBody));
}
diff --git a/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java
new file mode 100644
index 0000000..95bb5f9
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java
@@ -0,0 +1,24 @@
+package bjc.rgens.parser.elements;
+
+import bjc.rgens.parser.GenerationState;
+
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IList;
+
+public class InlineRuleCaseElement extends CaseElement {
+ public final IList<CaseElement> elements;
+
+ public InlineRuleCaseElement(String... elements) {
+ this(new FunctionalList<>(elements).map(CaseElement::createElement));
+ }
+
+ public InlineRuleCaseElement(IList<CaseElement> elements) {
+ super(ElementType.RULEREF);
+
+ this.elements = elements;
+ }
+
+ public void generate(GenerationState state) {
+ elements.randItem(state.rnd::nextInt).generate(state);
+ }
+}